diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index a9c45744cec2a..866386232dc7d 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -306,7 +306,7 @@ enabled: - x-pack/test/functional/apps/ml/short_tests/config.ts - x-pack/test/functional/apps/ml/stack_management_jobs/config.ts - x-pack/test/functional/apps/monitoring/config.ts - - x-pack/test/functional/apps/observability_log_explorer/config.ts + - x-pack/test/functional/apps/observability_logs_explorer/config.ts - x-pack/test/functional/apps/painless_lab/config.ts - x-pack/test/functional/apps/remote_clusters/config.ts - x-pack/test/functional/apps/reporting_management/config.ts diff --git a/.buildkite/package-lock.json b/.buildkite/package-lock.json index 62647ca6f2f8a..5b19d688aa3ff 100644 --- a/.buildkite/package-lock.json +++ b/.buildkite/package-lock.json @@ -702,9 +702,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", - "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -2261,9 +2261,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", - "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==" + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" }, "form-data": { "version": "4.0.0", diff --git a/.buildkite/pipelines/pull_request/apm_cypress.yml b/.buildkite/pipelines/pull_request/apm_cypress.yml index a64590e337ee4..3c95b2814f4e0 100644 --- a/.buildkite/pipelines/pull_request/apm_cypress.yml +++ b/.buildkite/pipelines/pull_request/apm_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'APM Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 4 retry: diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 718a7b2a32031..25a373de87509 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -23,6 +23,7 @@ steps: label: 'Quick Checks' agents: queue: n2-2-spot + key: quick_checks timeout_in_minutes: 60 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/deploy_cloud.yml b/.buildkite/pipelines/pull_request/deploy_cloud.yml index 5306b4f0094bb..722c6a2785c04 100644 --- a/.buildkite/pipelines/pull_request/deploy_cloud.yml +++ b/.buildkite/pipelines/pull_request/deploy_cloud.yml @@ -3,7 +3,9 @@ steps: label: 'Build and Deploy to Cloud' agents: queue: n2-2-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 30 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml index 0f572a98cefb3..8053cdfe2eebd 100644 --- a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml +++ b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml @@ -3,7 +3,9 @@ steps: label: 'Exploratory View @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/exploratory_view/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/fleet_cypress.yml b/.buildkite/pipelines/pull_request/fleet_cypress.yml index fcccdfe7a6799..2f8e629478657 100644 --- a/.buildkite/pipelines/pull_request/fleet_cypress.yml +++ b/.buildkite/pipelines/pull_request/fleet_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Fleet Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 50 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/kbn_handlebars.yml b/.buildkite/pipelines/pull_request/kbn_handlebars.yml index ecc5103619216..ba12674abaf32 100644 --- a/.buildkite/pipelines/pull_request/kbn_handlebars.yml +++ b/.buildkite/pipelines/pull_request/kbn_handlebars.yml @@ -3,7 +3,9 @@ steps: label: 'Check @kbn/handlebars for upstream differences' agents: queue: n2-2-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 5 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml index e5a1b6a445fd2..8a8d7e68e3f32 100644 --- a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml +++ b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Observability onboarding Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/profiling_cypress.yml b/.buildkite/pipelines/pull_request/profiling_cypress.yml index ca345f2c78dd3..f9fef28fa5fea 100644 --- a/.buildkite/pipelines/pull_request/profiling_cypress.yml +++ b/.buildkite/pipelines/pull_request/profiling_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Profiling Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/response_ops.yml b/.buildkite/pipelines/pull_request/response_ops.yml index 38ca242949d86..c984fba8f2e07 100644 --- a/.buildkite/pipelines/pull_request/response_ops.yml +++ b/.buildkite/pipelines/pull_request/response_ops.yml @@ -3,7 +3,9 @@ steps: label: 'Rules, Alerts and Exceptions ResponseOps Cypress Tests on Security Solution' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 parallelism: 4 retry: diff --git a/.buildkite/pipelines/pull_request/response_ops_cases.yml b/.buildkite/pipelines/pull_request/response_ops_cases.yml index 312c62c01c732..42ae473616e3d 100644 --- a/.buildkite/pipelines/pull_request/response_ops_cases.yml +++ b/.buildkite/pipelines/pull_request/response_ops_cases.yml @@ -3,7 +3,9 @@ steps: label: 'Cases Cypress Tests on Security Solution' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml index 3de3ece499a6e..a7f9754753ca8 100644 --- a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml +++ b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless AI Assistant - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 1 retry: @@ -15,7 +17,9 @@ steps: label: 'AI Assistant - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 1 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml index e65659a6e038b..f5f7f62e0d90f 100644 --- a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml +++ b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml @@ -3,7 +3,9 @@ steps: label: '[Soft fail] Defend Workflows Cypress Tests, burning changed specs' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 soft_fail: true parallelism: 1 @@ -14,7 +16,9 @@ steps: label: '[Soft fail] Defend Workflows Cypress Tests on Serverless, burning changed specs' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 soft_fail: true parallelism: 1 @@ -25,7 +29,9 @@ steps: label: '[Soft fail] Security Solution Cypress tests, burning changed specs' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 1 retry: @@ -36,7 +42,9 @@ steps: label: '[Soft fail] Osquery Cypress Tests, burning changed specs' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 50 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml index 248d953c485e6..c0c68d8fc2192 100644 --- a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml +++ b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml @@ -3,7 +3,9 @@ steps: label: 'Defend Workflows Cypress Tests' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 16 retry: @@ -15,7 +17,9 @@ steps: label: 'Defend Workflows Cypress Tests on Serverless' agents: queue: n2-4-virt - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml index 6196e2e251522..47565c2b2042f 100644 --- a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml +++ b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless Detection Engine - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Detection Engine - Exceptions - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: @@ -27,7 +31,9 @@ steps: label: 'Detection Engine - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -39,7 +45,9 @@ steps: label: 'Detection Engine - Exceptions - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml index 482107467884c..412047bd1921b 100644 --- a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml +++ b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless Entity Analytics - Security Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 2 retry: @@ -15,7 +17,9 @@ steps: label: 'Entity Analytics - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/explore.yml b/.buildkite/pipelines/pull_request/security_solution/explore.yml index 5acd56ebe7f06..ecb821b51cf03 100644 --- a/.buildkite/pipelines/pull_request/security_solution/explore.yml +++ b/.buildkite/pipelines/pull_request/security_solution/explore.yml @@ -3,7 +3,9 @@ steps: label: 'Explore - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 4 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Explore - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 4 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/investigations.yml b/.buildkite/pipelines/pull_request/security_solution/investigations.yml index 0390f5dfec8e7..f18c78f54ec2f 100644 --- a/.buildkite/pipelines/pull_request/security_solution/investigations.yml +++ b/.buildkite/pipelines/pull_request/security_solution/investigations.yml @@ -3,7 +3,9 @@ steps: label: 'Investigations - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Investigations - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml index b969a468c81bc..93d502873c881 100644 --- a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml +++ b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml @@ -3,7 +3,9 @@ steps: label: 'Osquery Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Osquery Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml index e36f77ec60988..88a63cbe5bfa1 100644 --- a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml +++ b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml @@ -3,7 +3,9 @@ steps: label: 'Serverless Rule Management - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -15,7 +17,9 @@ steps: label: 'Serverless Rule Management - Prebuilt Rules - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 4 retry: @@ -27,7 +31,9 @@ steps: label: 'Rule Management - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 8 retry: @@ -39,7 +45,9 @@ steps: label: 'Rule Management - Prebuilt Rules - Security Solution Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml b/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml index 6a82abe46eee1..74fe7a7e05969 100644 --- a/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml +++ b/.buildkite/pipelines/pull_request/security_solution/threat_intelligence.yml @@ -3,7 +3,9 @@ steps: label: 'Threat Intelligence Cypress Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/synthetics_plugin.yml b/.buildkite/pipelines/pull_request/synthetics_plugin.yml index bfa3caa62f177..f81a19d835bdb 100644 --- a/.buildkite/pipelines/pull_request/synthetics_plugin.yml +++ b/.buildkite/pipelines/pull_request/synthetics_plugin.yml @@ -3,7 +3,9 @@ steps: label: 'Synthetics @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/synthetics/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/uptime_plugin.yml b/.buildkite/pipelines/pull_request/uptime_plugin.yml index cbd1c417fc852..c1744101b018e 100644 --- a/.buildkite/pipelines/pull_request/uptime_plugin.yml +++ b/.buildkite/pipelines/pull_request/uptime_plugin.yml @@ -3,7 +3,9 @@ steps: label: 'Uptime @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/synthetics/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml index 7542373c0f437..476e8c204d15c 100644 --- a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml +++ b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml @@ -3,7 +3,9 @@ steps: label: 'UX Plugin @elastic/synthetics Tests' agents: queue: n2-4-spot - depends_on: build + depends_on: + - build + - quick_checks timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/ux/e2e/.journeys/**/*' diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 20a33917c1819..22199b5ac629d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1055,7 +1055,7 @@ x-pack/plugins/infra/server/lib/alerting @elastic/obs-ux-management-team /x-pack/test/functional/apps/monitoring @elastic/obs-ux-infra_services-team @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring @elastic/obs-ux-infra_services-team @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring_collection @elastic/obs-ux-infra_services-team @elastic/stack-monitoring -/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer @elastic/obs-ux-logs-team +/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer @elastic/obs-ux-logs-team # Fleet /fleet_packages.json @elastic/fleet @@ -1086,7 +1086,7 @@ x-pack/plugins/infra/server/lib/alerting @elastic/obs-ux-management-team # Logs /x-pack/test/api_integration/apis/logs_ui @elastic/obs-ux-logs-team -/x-pack/test/functional/apps/observability_log_explorer @elastic/obs-ux-logs-team +/x-pack/test/functional/apps/observability_logs_explorer @elastic/obs-ux-logs-team # Observability onboarding tour /x-pack/plugins/observability_shared/public/components/tour @elastic/platform-onboarding diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index ed90267b8ed8e..fd1f3713b7ca3 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 82249f9682f61..5f41d645e4526 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index 911ee04cb0414..680eda0db9d99 100644 --- a/api_docs/ai_assistant_management_observability.mdx +++ b/api_docs/ai_assistant_management_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementObservability title: "aiAssistantManagementObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementObservability plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementObservability'] --- import aiAssistantManagementObservabilityObj from './ai_assistant_management_observability.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index fd99099347c9d..5d7df1da0674d 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 5b5be6d8ed57c..53c4e5e4cf7c7 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index dcbaa7a49ee95..31f80a8c2bc0e 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index efde419e5b95b..49db48be16544 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 36247a4355b05..5c8e71232c811 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index e7c9ad4071bbb..c5c2e54ee8e8c 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 901a469efa137..9799bdc4e430b 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 5e4e98764f00c..ac581664bf63a 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index a29b6e2338b64..4d6d03e0b1963 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index f44905ac92032..23f3eb9a0a4ba 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index abd2c4a1e2e03..ce03f8c7e92da 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 6b4d45502a8b4..2f2994ba2a3e7 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index ea668277e1728..1c8a8bfe819b4 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index f3fcfb68df8f8..8525d5ca6165d 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 13efe49e68fd7..096890c2c0e66 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 81365f8459915..25e1213886ed5 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index ac5867264ff7c..f469d786541e9 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 6734745e67c63..05544530a3866 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index e8075c2dd518c..a97e7c7a3df89 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 1d3bd260c24a9..de6cf5b664d24 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 4d40665e74633..eaefdbf517d25 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index e0cbf930ea341..f97705cb1f831 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index f54fee931babc..7efa349485f93 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3233 | 31 | 2582 | 23 | +| 3234 | 31 | 2583 | 23 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 237d49f8062cd..190f14c570791 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3233 | 31 | 2582 | 23 | +| 3234 | 31 | 2583 | 23 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index d8432bd6b08a1..79a7e24555295 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -31990,6 +31990,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.ESQL_ASYNC_SEARCH_STRATEGY", + "type": "string", + "tags": [], + "label": "ESQL_ASYNC_SEARCH_STRATEGY", + "description": [], + "signature": [ + "\"esql_async\"" + ], + "path": "src/plugins/data/common/search/strategies/esql_search/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.ESQL_SEARCH_STRATEGY", diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index c9ed1a59b5450..06f093043dbeb 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3233 | 31 | 2582 | 23 | +| 3234 | 31 | 2583 | 23 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index cf806d08ea16f..d7dfe68e8d429 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index e1cf0575200f7..cf4bcaaf7ebc6 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 4d00d33530f4c..9dbd4a9aa0c8e 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 70ff5ae83d530..b02683a03fbde 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 8d1d9686a08f3..c814b6b39335a 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 74ac1f4f80c9a..4d8f4cf66e508 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index b48571204af97..5f374d8ebf4b3 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index f269d46230862..d5a35cfcfebcc 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -466,7 +466,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [overview_tab.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx#:~:text=indexPatternId) | - | -| | [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint) | - | +| | [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index c16f4b5ec9cbd..18aeb8cb06a15 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 897fe31347103..b3658165d6ce7 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 2f426db5298e5..3612bf992feed 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 736e6e9d99a13..98ef178897d54 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 6d1047b0c722c..1edafdf100df1 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 9bebddea85c61..1834c1437151c 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index eeb81cd10b66e..e962691418112 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index eb021a8215421..f8c5d3af0296d 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 97cc8e4183c65..a0036f508f166 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index b0fc143dd4a91..b6dfbbd4b3541 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 013cb39590a01..231a1bbfa493c 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index ec57f62e0c8e9..f829354971693 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 4810eb7ec6de1..2b8fe9e98d362 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 99143a7510ee3..ce3b5a969f42e 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 880f114feb569..e10414d47ecb6 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 8a0c3bd9e4f6b..cf7156c9f3c54 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 29b48a8c6e195..8ffbf3bb53b13 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 2678e48b832b8..7b28359de5c5c 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 151dccfbc144c..a36724b7b3d2a 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 86e41c6b93be3..3006ffe1d7bec 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index ab809a16aecfe..e3c2db213910e 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 177417deee0e1..101c4278aade0 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 47c3c3882d0b4..8bc0d8dc26af1 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 939d82c8fd808..d130be4351637 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index befec179d0363..ff88990e5ea2a 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index fd7eea12863a9..f2f0132b9248d 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 736633d6cef6d..496aa331031da 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 84e4f32df3e51..fc319fc8f0ed1 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 9bf5252974756..7e75bf8dd3556 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index a34eac8e31980..761d7b21ba3fc 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 1e09393a8f0cf..4c8d714714b39 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 61524f0ba96c5..d8145f1719cbd 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 18ac9f1aeb4e5..9664e94de12f9 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index bc9359076586b..2ea4de3cb1bc3 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 4f4eb25c64d3f..f369a7d352d67 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index bb2fb99a701d7..b149a78021e7a 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 78d8c644b9776..e05fa7ec33757 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 139b81ee676f1..ac80022b15f6c 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index db03827888a91..b59a0a80f3494 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index a06b1e877a1f2..48d7685359691 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 35680d4a0ad01..b18c8a4c2d50e 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index c195451d72266..c2b7c742aea37 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 3386a3aaef270..d132794bfbf16 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 4df703593f78f..785aa57feffb8 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index a8f90ec67e45d..18fe7eb2caf6b 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index f79211a4657ee..a9965f085e5fe 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index b959200843742..b2c72203d0025 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 4661562a07ae4..710323d1338b5 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index d2dea1664a149..8abb8e7f58dc2 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index dcedef2c65e85..fc6ebc48302a3 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 107e35fd85333..d1a1d817410c0 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 4439961d6273b..c89b9e969df47 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 6cdd0ff78a971..1da99bd715621 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 6aecc6d3de214..61f23f9a94add 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 38d17d7b35044..bf98f9e2effd9 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 7ae8e9bedc6ac..7858dc6b6930d 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 59abdb5440840..c8bb22a6c27df 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index dc5884f8fdaab..f5e885851ea83 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 90679326f140a..d36508f2e4b17 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 30c3f0982e624..8b338b594bfed 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index aa9782f4b5893..3e6e1575cab7a 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 3d1546b28fa16..6c34167cf7c4e 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 72be03d201a00..c637e745f6c5f 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 71a9bfd161e52..9be9f77aba7ad 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 1bfec8c47e10d..b1d3c6268e591 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 469a772714274..5f45336764e16 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index e2fa88541566f..c99d7db7c35d5 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 832108a5c4f26..ea194e55cb402 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index edcaa27dd6d5a..816ceac3a3fe8 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index c9ba6747a282a..8a45ab8844767 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 9247851e59239..6c95813167eda 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index b81d639596817..93546b4b27690 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index fc4bbd977b5d0..8291f6fb90b15 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index d55867c919335..aed9ffbfc1e88 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 2656355e7afe2..9b03290a43dc6 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 20f48244032e8..437564a25f7b6 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 6a36650d21777..d6d4b6e95e027 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 5208e1ab21b8c..fa56a1a607ffe 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index cebe278f7f6eb..d6325da3758e5 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index d8b2a81ef6bcc..3ddd751fe3632 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index d18e497bc7617..d576c4e454a82 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 3680ce545abb6..d60d65e6b4bb1 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 9d35118456345..16e8612157072 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 9419b075ac6f5..dfccc63840ade 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index c6fb4220f3f41..75fabd3186efd 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 9cf2eb6fcd06a..68ea1617b4adc 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index c761e6d6882f7..660a67a564a17 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index cfa99b0799a61..c8fbccf71ad0d 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index b4cae656c4771..122307d6d85ec 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index bc0209715b11e..d15e7a8c7fcc4 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index ff3281cbd5e26..e5b5becbd7a05 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 2a5b70c9fed3a..b7a0a86b2f083 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index ac09e173d3c7c..ef38d26b93448 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 1d727b80948f3..fe8f23f086ea2 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index d7a177ad61ed2..c8c112e573798 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 97c34310171ef..07391520d5009 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index c869644d34c93..305ed6cc1c77c 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index bfc3f3b8fa7a6..383d81595d3ec 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 5baadaa28e24e..cbe97a4dcb4d2 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 14dfe8c139c8b..4302dfd7d6a5b 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 66371c995f9ad..00b2f52dcfc3a 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 3b265838231f7..e98bd7aaba342 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 1e180734e5203..aa2e405cb6605 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 7ee4fbf0f8507..c222b2e32a8c3 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 14b3d39d655d8..bbcc9f3c842b4 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 42b1866126b65..2cbb32c846aa1 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 6ae565d8c6c18..480315a7f275a 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 7e3be23d4fdf2..12a11223d7886 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 1c53bb69d343e..a1ee1e014d30a 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 4e8a5fa92df28..324f994d66695 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index fec87554cf252..0a79d420030d5 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 17184a4a1b52b..8d84c5326c0ca 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index bfbe043dc7b16..bb3de5e371a68 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index ce1ea204aea2a..5f2ec896433c8 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index eeade29e6fc82..e3b5f86824bed 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index f86cb1a250d33..6ce78d7bf0c84 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 2bbf32cfea300..2ff80c7266b0c 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 99a12c77b517c..473b7867f637d 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 4fe2916e44c0f..c9e5203a6bb26 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 2948ad3952fdf..a3a55805e7be8 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index a954c6eb4f5e1..bd573de714291 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 8eeb0c21fd277..08dec6dd7abcf 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 8dca0efd15999..b4ef8e46dd3c2 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 0ce77640301d6..c6503538602ae 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index a1c297b220eaf..0655d3673d2a6 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index d4fdcec78ef3e..6b01c74f4cc2e 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 8c41e8d46f1c8..005db5569421a 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index d7d6eba532639..2e169e39caaa6 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 91f9a721468a3..198e26f0625a5 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index c28aee90a2651..fe1caa8e336fc 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 448b33f2e67f4..eb8c6ad42d5cf 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index afcce5c0bb5a1..ce1b1dadaecf9 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 7ce72217804bd..52b94539dc899 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index bba3861d3670f..a01307b1fb436 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index a1bc44aa15784..d26e31330ee55 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index e11a31c19e08c..5cc2f28bbd473 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 1e73eb13c5b2b..531b8ef690a8e 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 88a435553de07..2be17e85417b0 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 5dce66a867f15..8c428f15b2bbc 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 11a837608d432..f321f32528a20 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 0f27d703ce2b2..28485f2cdbc2d 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 3838ba03f030b..18433da22ceaf 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index f2c2a5de4f4fd..3fc230dc83ecf 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index ce6d1512b1d4c..dc3f55d12faf4 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 9be298de932d2..b91c6a6a18f76 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index cec48bcc82f4e..891d0ba3b4748 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index a7e0391d1d5b8..761265e118572 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index b3c976efd8b09..5bb3118f750f3 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index ce968630700bc..db08b7b8ea1bb 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index dc588d8eecb9b..5356f9c4d734a 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 0c22e63dd2416..c1a6033f8eb8e 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index f92521093fb77..bdc7ce3ba0cee 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 178c3f3a1eb09..16bdee8dd61fb 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index e3587dbecbcbe..858f6913c19b0 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 582e086cab037..7c2c8521200a3 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 13acd04d07074..499d342eaaae4 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 079e178785637..cd7e3e12ca54f 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 8129c7d65b3ed..a7bdbbf742d7d 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 03d97749a5e92..59055d0fc425a 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 4bcad517c21f5..c9918f2930fa2 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index e0a50897faf6d..c9bd462108ef0 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index d3ae0d7c09fad..ed3cc14537738 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 3b5c440ea6393..f12299a7d2f13 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index b1eff441bc5c3..59acf1376341b 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index dec8bf268a179..24ae27af27366 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index cc09d3b3c7240..be2995f6cef09 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index f6c9a86f1f0fb..ab3a12fb16010 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index da3c0fa5134f7..c50a9daafb1b4 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 0a41b609c8bc1..16797c5209bfe 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 9da4d6be752db..290d3f01fc8c5 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 752d9a0b028ef..9fc763749af9c 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 7d10e3d4c9250..47a01596486a1 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index cf3689e34a7c7..8f181db0af1df 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 8e24f86f961fa..8eccf4a13781a 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 12cfa4519c47b..4cda9c4928716 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 7061cbc283dfa..778177b6f6441 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 6b32d5b5fac0f..a29210e78bae9 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 86aeaafa7dfea..6c9e736f98f12 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 900e465135015..11f9b9a4dcb7a 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 2348c8e9a737e..b53f90789f268 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 8bd13bf956fe1..d206939d66feb 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index ad283af308139..cdf4fe1a1cf7f 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 1b57d099e0108..a154afbd70d00 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 5fed069727771..c31a9024a948e 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 736d9a7e27cef..473f561fa10a3 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index d2b781db785e0..2e1f3395d4fda 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index da7f742417ec7..91cfc52ae3b08 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 22f3cdb913229..c139f3a1554fa 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index e5d11c20ebe24..68390675ab9ca 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 18ec7543d3576..5f1a00afb92e8 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index bdbde151dd1cd..a41a499e58cfb 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 9830ddf0e6fc5..01180c1fa5f08 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 768babc2419dd..eb4b2f8971526 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index d9fbd58bdefb2..0995307cea006 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index c879f08bd2b64..5ba69a555f9ec 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 7f18841406868..1a393b786f539 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 873443d7ab094..eef8e88c88fb6 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 57c2022c2192c..b55839b53e7ef 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 6119fafca05c8..dc82232b60077 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 7cfe950f6c57e..2a28ceda441b8 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index d4f76173caefd..8364da71e78d0 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 091f95b57028b..9745f7e1b10d3 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 0421f6741956f..397a2170bfb37 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 89f4d0d6b13a5..72cc21cc1f897 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 17a38330691c5..f95400e53f156 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 95646e274e261..94712d8faf155 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 93323e4c4fc4e..6611539a9b9d6 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 294493f53d343..1c81193365da3 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 79dc2f52abb5c..4f2f10ef3f95a 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index cbfab4bdfd0e6..01dad36adc1d7 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index b3f1e55727323..80f2a6ab81e7a 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index f03b04b3b8dc6..6e538494c8486 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 508a802332b5a..fde07c3e8fe81 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 45a919ae0a790..6d028b7a10c3a 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 4dfa7534da2d4..541343acf13b6 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index bacce662057fe..f0941e5187310 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index b5dde5df8961b..6d5ed6ac10a27 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 7828aee9ece49..1569197a09abe 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 056ad756ba077..ec171ae609132 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 7b3a34cde56fd..4d2bd3e11b9d6 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index e4e3b7f0d6002..4e11e799c0f53 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index cac0ded66453b..0e7a24e6b0e8d 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 5fb0485bd73da..ee7c619b51303 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 0a3e5a76c8a5c..8779ce495e846 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 7376937280f05..b5b2e276a0e11 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index fd0691269f7fd..e0c8ae10ced55 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 31f761e749f85..a1d6e12d86777 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index f21192e7c7bc3..4c3e400346f68 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 842ccf7225460..4d3e9454d4d29 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 45efb7295c927..3282bbb267d11 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 6b5d9e7a89998..ce6fcf4acb1f8 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 5eefeaf6161d0..ca658f5d9e384 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 0f6a0def75c55..8b8983d3c593a 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 32a92acdfc770..296cf3f0b3c70 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 0c3a03eb8b3ed..f4706862d5916 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 6f590bf71a925..2cdf8d9acc90a 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index b14c9e39286b1..922401548eec3 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index a61906d57d1c4..ae26e62457f05 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 49c3d761e43f4..c4cf7b5e82eff 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index c9efaf0aae642..c213420dd1ccc 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 2698235448d9b..12d9668c4ace6 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 8738e8424dd2c..818d6e7939cbd 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index e42caf692d23f..abdaccbe1f18c 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 164cdefbb4627..0b465ffb0f042 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 6db393dbb79f6..13cd53e21512a 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 5acb454161066..4204fdcc3b623 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index d6360c1a0759e..fb48490d8d5cd 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 94506d191138a..9d45460a8e689 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 2f4a393ed2eaf..0be1b162ff3d1 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index aff352f1caf4a..f6e5d8bd1f40e 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 69b7cfacc45a1..4d0d3fa1f365a 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 9a3aae337f1f5..9598e6d7f2eb2 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 5314c78cec4b1..03c491f02f979 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index d8728b517dd70..5ca7ff868df1b 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 4cff78cdb36a6..5f2fab4355cd5 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index aceff9614257f..fbe1417fa46a6 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index c0796a1c599b8..7547ad49d70a4 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index ca0900ce860ba..77a40abc3af33 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index be94108cde6fb..6de5df01f1c0a 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 85d3349261d01..8161f64746a5b 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 83b26ab7ebe33..857536da58c2a 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 761fc256b88fa..f6b3c0c53e5c9 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 3cc1bdd00a350..23522251ffdf5 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 771d9127a1a9b..22b6e39973b0a 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index c5a361b46351e..90097fc870017 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index c789108ad8dc4..97fc47fc7f4b0 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 5d347386f98a8..5f1b26e5ce513 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index b5e1255a156fe..51c035d9678e9 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 494a5ad30fadd..425bcabe59cdc 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 09f651e6d401d..a32d16e293518 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 31c93ce4e74e2..f9d989a5d5336 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index a67e392e24cc0..c1aec6f3f5988 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 129a8fe5796c7..6733e64aea77d 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 5e9bd89ba93b7..9b772c4ce3b2e 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -952,7 +952,7 @@ "label": "serverlessSearch", "description": [], "signature": [ - "{ readonly gettingStartedExplore: string; readonly gettingStartedIngest: string; readonly gettingStartedSearch: string; readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; readonly integrationsConnectorClientRunFromSource: string; readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; }" + "{ readonly gettingStartedExplore: string; readonly gettingStartedIngest: string; readonly gettingStartedSearch: string; readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; readonly integrationsConnectorClientAvailableConnectors: string; readonly integrationsConnectorClientRunFromSource: string; readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index d8c8048a4138b..e49253a05874a 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index c8fccbaf3640c..bc624c0f35616 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 20847765cce58..8611753660e00 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 65c450de7485d..0fd2bfa3a606f 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index 306a49d505070..44f9c0415346a 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index deec68881b81c..c10a5f2cb6485 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 505e530286e1c..af55c2220df38 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 802adf54308d1..62aad73ce7fd1 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index c26cdba43916d..2ea1002a282f1 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 806bfa95069ac..93a1c08b0baca 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 231c6f5c92e5d..9bf5ea8276b59 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 493badbded104..72c4f3e6492c4 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index caef60f944df7..6583f2a564e6e 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index d123a1e35c056..ada7f3d760fea 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index d1c7aa5fa2373..dbc7affe8352a 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index fc139464d8696..1915fbfc6f338 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index e27f9794eb244..def6cbbb10122 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index fe2a47cf566f7..487e066417b2d 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index f23bfd9273cb9..6d0aa183c0803 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 199303d574eb3..1fe0c35d3a46a 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 9b9d4d074bb93..4a829477d3123 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index f1efebded763e..fb2ec3df9eed2 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 2d29e9efa47f7..049a6536b4501 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 1a1e5a9330b8e..7ef40b8ac96c3 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index d4814ca947b26..9d4c8e86a96b4 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index f4616a4fb961f..35a796e9ed5c5 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 28a28a70c57f9..8e82135702ebf 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index ed9c068ea0dee..b4e454e20c5f3 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index ad3a20db0d999..f38af410785d7 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 8b113c005b018..7a5407a0ebb3a 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 88fcbe114d2ae..b3951ac6e6cb1 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 6b2d6d0a10d3e..569dba67d8c16 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 48f57f6471171..136d8af2eb943 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 34e9adf53e413..e641f9910788d 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 4b5c26f1f85d0..4683101523058 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index e9a3cb255464e..69d86613486be 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 5d8c12c4cc102..f595701fcd762 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index d86269a03cb76..4f30fec2c9e96 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 010329466d131..f2fe0df7a67bb 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 77f22b4c7dc8e..f3917ac319c19 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index cda8578037c32..bdf3602691664 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index e1044f2dfefec..ee5617929eba4 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 8c942b7565fd1..46d56d2cdc611 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 4a2e67adc7494..52860bfdc7d1b 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 8806be33b58a3..67f91d10b1cd8 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 5962e103242d3..9ec8ac07a88bd 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index bdf4c612aa140..ab23d5ab054d1 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 3589cf5f32224..c6d494f21c460 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index dcce58d12dd9e..525f2cd0c9537 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 660b5fa539f39..ebac8f0efdad7 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 2b4c67a7d206f..10ae17e85b282 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index c3bca4e3c98f7..14170ee4942dc 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index fb1b2151368f2..acc3922f21f4d 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index cecc9ea19d31d..9324de0f45b89 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 338f0ad098f1a..45ecae3794fbd 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 1725f484044b3..220f3b0d351fa 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 87ecfa6dd312a..891ea633c300b 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index aaf2603a6482b..a746da0810ac0 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index b4897ee080237..f6f192a9e7053 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index bd26144824221..55777948d2bad 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 682a8c24be44f..05950e194b0e1 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index ef9400e91ccbd..677efe4b96521 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index a18f554074f77..5727a10b2cafb 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index a89b698df3ac2..9f2b1866db17c 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 8c2a1d7c21870..5846fc4d1ea63 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 6d54e9fda12ac..0862a5db5ba75 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index fa30a6bdb1c5a..498de85e84c52 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 60baaa3a47535..c5c6f9f8f10b7 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 4d31683b6154d..70fbe45e5eee0 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 409b4caae6a3b..9b61322013f6f 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index ec3cc8e2ace37..8a72395e4cac8 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index e68510843a590..497bb0c423e72 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 9ed5b0e73cfa6..47aa7290d47a2 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 24c88b956268b..df108ad4bdacc 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 65167254fde5b..23c495b7947c3 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index c2786dbb9c28a..a04f35476a8bd 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 881cf4467557f..85c918798575e 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 5586301b1c085..425964e59a1a3 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 12f7e2fb767bc..a4120c31599d9 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 2415d055d6b6e..ad324735556c1 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 2b714ab9c18df..9cc8ef5f8b26c 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 0452a7496d376..edf8e4a8209c9 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index b0c6e5b82f6e2..77e064c4b5a91 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index c514fa5a6d45a..1ea1c0ce6be5e 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index c9ce6d58d5301..85a8122c8202a 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index b838ada545d7e..70bc1457a99fd 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 67ea0618937d4..daf0289648a91 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 4257a72892fd5..f0178952a4d23 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 8149b79d06def..5da147094e90e 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 125144e265b05..a8bf279cd8739 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 09849284c9c6d..985422a4de879 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index da184512d77b9..3c73ba8495c84 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 55a90b307ba91..d66b83274b781 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 347b74807d742..0993b27ff8fb9 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index e12a73ebc3de2..7b948d86fda4d 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index be6ff42bb2013..2cf9b7e37fa4c 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 3d3a924afb8fc..deb546b71e1ea 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index d1f1d4ae38048..0102bc3a1c1b9 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 1be6c960ffae2..d5ca4b4963a12 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 80f6a3603f8ca..d2aeb69252571 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index ea92bcb310208..ddfed53d8e15f 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 6a0d7f069f4bf..93c1bd4a3a181 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 252adcf7d5fdc..f18446a66a97f 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 525d79171c501..da6d7955cfb08 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_library.mdx b/api_docs/kbn_presentation_library.mdx index d840b1436231b..226727f41175e 100644 --- a/api_docs/kbn_presentation_library.mdx +++ b/api_docs/kbn_presentation_library.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-library title: "@kbn/presentation-library" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-library plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-library'] --- import kbnPresentationLibraryObj from './kbn_presentation_library.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index 335105fe51e89..668e9139396df 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -233,7 +233,7 @@ "label": "apiIsOfType", "description": [], "signature": [ - "(api: unknown, typeToCheck: string) => api is ", + "(api: unknown, typeToCheck: T) => api is ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -265,12 +265,12 @@ { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.apiIsOfType.$2", - "type": "string", + "type": "Uncategorized", "tags": [], "label": "typeToCheck", "description": [], "signature": [ - "string" + "T" ], "path": "packages/presentation/presentation_publishing/interfaces/has_type.ts", "deprecated": false, diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index dbd3fc487ee61..ccdbe359a285b 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 53584e2ac55fe..cc482228b2802 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 06b4bb1282b4f..54817af07108f 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index b84fc599c3c03..a1444ae15ceaf 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 7d1eb9f1e1070..780e436e823d0 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index d13eed39393b9..db6f5bbb1f37a 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index ed67848895281..17c9bdb0d5d76 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 7b61988658841..34d32270d4931 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index d5ba4ccaf6876..dc68428e10141 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index fc85146e3a6ce..77e126f38aa49 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index de1689846ff02..4f2b1e3c9abaa 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index e151654d53be8..86281dc7a39ff 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index b5e7b8f552b34..e5c73170637f4 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 58bf76d5037dd..010f2123761c8 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 6472286656558..e56e15e45ee8a 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 2c6437d1083d8..2f49452043bdf 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 91a9110783c7b..54bc86c810897 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 3f75e913ed50d..75cd62d8c91e1 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 5a7235a12b00e..d8d5334c917c5 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 39dd72b2924a4..992e00391448c 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 451cc72c846ca..1803f26ecb179 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 78594e935a79f..4a115229ea7f2 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index bdf88e0accfc1..1129ac5945e50 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 03f621f73e64b..7bfbdd0687a8d 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 2a79f8a9771e1..1ddb6f16b8ae2 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 8ed28beca2c87..ed1e9b9286e25 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 95d1a2c030520..d6a92c5c829ec 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 6dab81dcbb0bc..e47a3737a3e32 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 2be2bb282478a..4b66ca71de924 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 360bdf6e012dc..e4f09fb6b2b89 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index f14800a85e1df..f9ae6c777c432 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 288dc3e47a0ed..6f322e91d0f6b 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 04f8ac7afede4..deca152c9a107 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index cda846cdb49e4..e336ba5548ad1 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 36dfdb0297e0b..ac9f5e1fa1bc0 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 3b388b1e0f549..12f726b5ec66d 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 16219b2101606..7b5fd874358dd 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 56dc33ec750b0..98d78af8351e0 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 0f1e873d48c43..c7bf45c0ff37c 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 201eef035d8b1..d049296900c64 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 0af1a5fa26e68..4945ab129cddd 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index b501ec1199d93..23675152b3593 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index a60e76422f136..ea57be8285146 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index d144428394c1c..b610f1484269a 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 7db0def80655c..ed37217af4cb7 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index da1a3b8bcc43a..597f64aa3473e 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 804e2283c8ef6..c796241841df2 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index da1a447f249f6..1930483865ef6 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 4ebc74033d515..723e7bd4749ee 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index aa5588a13dc13..ba67bc1be7442 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index d62eb2ee1afd9..3ae97566f34a8 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 642ee071bb92a..5fbdc7bb91cf4 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 64f665fc636da..682ecb79eb115 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 6e72a3066bdb1..18aaa49970427 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 4a085d5937607..c87ce34dc102b 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index c8df4d80896a5..e2688921ce4f5 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 6678f3cb88c8b..3fcaf4cb83fe9 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 2164846468e9f..4607a1fde09a3 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 2f6c89715babd..0b611335631de 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 9b0d406dc72d3..ddc7d1a1dd5be 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 53050cac245c1..6916302a6712c 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 344f5851b2814..ae83f16892e5f 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 9cbe198c93e20..37c44ae809a3b 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 66fbb422897db..4c45cd90ae595 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index d50aa2f4ba455..2399ab69bcf8d 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index dddd77929f377..622215976472d 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index fb52faaabc32d..bf34d3f70e533 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index e3d9f03b896fa..9594cf7ad0853 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 0f58fabcfabe7..5d796c1d285ff 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 583e5151eceb0..caf3447a46e1b 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index ca3f90ae04fbd..ed75a5321772e 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 644b30546dbb2..1205243f54786 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 1013d6df8c22d..502c4616454e2 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index d1473341b1427..aff429d14272a 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 93c9e946ce535..cd9ce765927de 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 9ea89900ac4b0..2efb836d4608a 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 3d12ab3e32555..99cb95295b662 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 2f1ea2254c1b8..e6877ea433351 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 421fbb5adb040..800ec83050ca9 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 662ba5c3bda99..ddc0ab26fe07c 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 21625b56a615b..4fd05b051c4ae 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index b118acd19431d..e7edf861cd1e2 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 186d838c43e86..047fc52e4ab4c 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index c45ad5dcb8b5d..e8829dc0e31ba 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index a7d44fbde0052..f00b99348bcab 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index dc91fec32c24d..18888b748993a 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 37675b3a8a174..c281d09b32d8a 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index a940239799a28..d8b294b7cf0e0 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 803133b135fdc..0e9ea95cf7bd7 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index d275ddfeeea93..e58572aa04724 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index ec9fb93e61026..416c6781feb2d 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index c57acc5538b0e..1a2b02b31ee72 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 60c884fed69f2..4a432c0696fd5 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 6a9f63048cf5f..30581d4bbc515 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 8bd4733913550..0fef932860a61 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index b25a8f625c410..e0bb1c13a729c 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index fe5bdcf7b6f67..d3b2ce8cc9208 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 687f79129d9c0..6e5f09c0b4432 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 6c74398b75dcd..62c19d41554a9 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 0835460a336a8..5b6976502cff2 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 0155aec4101c6..3d44ad2826e72 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 7911529b92466..555d3a85f727e 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 34eda8380798a..c698b757b988c 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index f1f657b80f562..c672139177970 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 837b4e1ef3b04..f6c3eb2c788e8 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index f26243df37405..107ffb928dddd 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.devdocs.json b/api_docs/kbn_shared_ux_utility.devdocs.json index 5d184997b8bfb..b75d4b863c6d6 100644 --- a/api_docs/kbn_shared_ux_utility.devdocs.json +++ b/api_docs/kbn_shared_ux_utility.devdocs.json @@ -19,6 +19,70 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.dynamic", + "type": "Function", + "tags": [], + "label": "dynamic", + "description": [ + "\nLazy load and wrap with Suspense any component.\n" + ], + "signature": [ + "(loader: Loader, options: ", + { + "pluginId": "@kbn/shared-ux-utility", + "scope": "common", + "docId": "kibKbnSharedUxUtilityPluginApi", + "section": "def-common.DynamicOptions", + "text": "DynamicOptions" + }, + ") => React.ForwardRefExoticComponent> & React.RefAttributes>" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.dynamic.$1", + "type": "Function", + "tags": [], + "label": "loader", + "description": [], + "signature": [ + "Loader" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.dynamic.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/shared-ux-utility", + "scope": "common", + "docId": "kibKbnSharedUxUtilityPluginApi", + "section": "def-common.DynamicOptions", + "text": "DynamicOptions" + } + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/shared-ux-utility", "id": "def-common.Fallback", @@ -187,6 +251,36 @@ } ], "interfaces": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.DynamicOptions", + "type": "Interface", + "tags": [], + "label": "DynamicOptions", + "description": [ + "\nOptions for the lazy loaded component" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-utility", + "id": "def-common.DynamicOptions.fallback", + "type": "CompoundType", + "tags": [], + "label": "fallback", + "description": [], + "signature": [ + "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + ], + "path": "packages/kbn-shared-ux-utility/src/dynamic/dynamic.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/shared-ux-utility", "id": "def-common.WithSuspenseExtendedDeps", diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 06a7b41b2754a..d4aa475fe227b 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 11 | 0 | 3 | 0 | +| 16 | 0 | 6 | 0 | ## Common diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 0e091c6fc3d80..b4050160b1f4c 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index c2a419383cfbe..0ef5af9a5ec1f 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index ff56210c6a762..e5de625033b47 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 63e47bd847ab1..fffcfd7831d40 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 55212ac7f8a44..9f9b05a0800e2 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 5712c553b4484..93d8a2089b195 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 4122d9bc32f12..f4417bf103e4e 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 0b917d0c8e808..6327322a562ed 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index bf5ce913b136b..6571a2b8776ff 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 01d72a515733a..e07f64b6adfa4 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 9656e20d57ac0..474a49900eb91 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 7830befbc3044..7d97a26757196 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 6d821b2a3617b..7761427551975 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 34577f0d4034e..d705d5c9a22b0 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index dff38abb0a173..937d88d694249 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 7da97a821ba7e..38cf2fd1feed1 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 959517e3294ad..fa242e6cdb14a 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 5b943e447ea84..8603c9b1b69e2 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 8107939738724..b9e8bb8e190d6 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index dd78add52a7e2..6004a79d2066b 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 425ec630a8811..5fe8406b1da4d 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 7691e69d6aeee..9f1a40d74ed7a 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 9fe32d6fd257c..893857cf4f3cb 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 48b2b7f7ed604..a8034772dd1fd 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 68638aa905d1b..66332db7bed13 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index a7acf90331044..fdd7066a8c94b 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 17bea913c6093..ab094c6783863 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index ed6c1f671669a..c5ac15b1dc553 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 1c4a6f353a4ae..12ae4425c8ac8 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index a2eb5346600d5..5c6d1ce5b8d97 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 533858ebba702..258fb3b3e8e3b 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 713e95770ab5c..1897a8f91af9e 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 7d90b71300a32..7ea0cd1a1520e 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index c41a0808e3b3b..a7596377d5e0c 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 384b747f4db7c..ae00d9b9c1550 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 44778dc832884..2cbe950361cca 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -2992,6 +2992,10 @@ "plugin": "cloudSecurityPosture", "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" }, + { + "plugin": "cloudSecurityPosture", + "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" + }, { "plugin": "dashboardEnhanced", "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 17157385e16d1..dcc0ebdb5dbad 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 8acbf90f6f759..fa34dba9b138c 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 717658285628c..5397dd1503f6a 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 202587a8468b5..4150bfdc21cd0 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -989,7 +989,48 @@ "initialIsOpen": false } ], - "functions": [], + "functions": [ + { + "parentPluginId": "lens", + "id": "def-public.apiHasLensConfig", + "type": "Function", + "tags": [], + "label": "apiHasLensConfig", + "description": [], + "signature": [ + "(api: unknown) => api is ", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.HasLensConfig", + "text": "HasLensConfig" + } + ], + "path": "x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.apiHasLensConfig.$1", + "type": "Unknown", + "tags": [], + "label": "api", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], "interfaces": [ { "parentPluginId": "lens", @@ -10625,6 +10666,30 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-public.HasLensConfig", + "type": "Type", + "tags": [], + "label": "HasLensConfig", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.HasType", + "text": "HasType" + }, + "<\"lens\"> & { getSavedVis: () => Readonly<", + "Document", + " | undefined>; }" + ], + "path": "x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-public.HeatmapVisualizationState", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 8f9f2a5175872..9f753239c39dc 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,13 +21,16 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 658 | 0 | 557 | 61 | +| 661 | 0 | 560 | 61 | ## Client ### Objects +### Functions + + ### Classes diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 6b1799b8c6b0e..31492b0a75798 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index f3ff84a77852a..e991c6b2497e6 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 22011469715de..89be7731e81f4 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 5b3312ad1fe04..4f7a33a08a77a 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 500b39c6ba825..bbff86a096543 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index e9400d1bb690d..4225f815cf2c7 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.devdocs.json b/api_docs/logs_shared.devdocs.json index ee1cc16b8f92e..d24e8baf6dac3 100644 --- a/api_docs/logs_shared.devdocs.json +++ b/api_docs/logs_shared.devdocs.json @@ -270,7 +270,7 @@ "label": "LogAIAssistant", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", { "pluginId": "logsShared", "scope": "public", @@ -278,7 +278,7 @@ "section": "def-public.LogAIAssistantProps", "text": "LogAIAssistantProps" }, - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -293,9 +293,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -310,9 +310,9 @@ "label": "LogColumnHeader", "description": [], "signature": [ - "(props: { columnWidth: ", + "React.ForwardRefExoticComponent<{ columnWidth: ", "LogEntryColumnWidth", - "; 'data-test-subj'?: string | undefined; } & { children?: React.ReactNode; }) => JSX.Element" + "; 'data-test-subj'?: string | undefined; } & { children?: React.ReactNode; } & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -327,9 +327,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -344,7 +344,7 @@ "label": "LogColumnHeadersWrapper", "description": [], "signature": [ - "(props: StyledComponentPropsWithAs | keyof JSX.IntrinsicElements, ", + "React.ForwardRefExoticComponent<(Pick & Partial>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -352,7 +352,15 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ", { role: React.AriaRole; }, \"role\">) => JSX.Element" + " | undefined; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick & Partial>, \"theme\"> & { theme?: ", + { + "pluginId": "@kbn/react-kibana-context-styled", + "scope": "common", + "docId": "kibKbnReactKibanaContextStyledPluginApi", + "section": "def-common.EuiTheme", + "text": "EuiTheme" + }, + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -367,9 +375,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -384,7 +392,7 @@ "label": "LogEntryColumn", "description": [], "signature": [ - "(props: StyledComponentPropsWithAs | keyof JSX.IntrinsicElements, ", + "React.ForwardRefExoticComponent<(Pick & Partial>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -392,7 +400,15 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ", { role: \"cell\"; } & LogEntryColumnProps, \"role\">) => JSX.Element" + " | undefined; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick & Partial>, \"theme\"> & { theme?: ", + { + "pluginId": "@kbn/react-kibana-context-styled", + "scope": "common", + "docId": "kibKbnReactKibanaContextStyledPluginApi", + "section": "def-common.EuiTheme", + "text": "EuiTheme" + }, + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -407,9 +423,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -424,9 +440,9 @@ "label": "LogEntryContextMenu", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryContextMenuProps", - " & { children?: React.ReactNode; }) => JSX.Element" + " & { children?: React.ReactNode; } & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -441,9 +457,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -458,9 +474,9 @@ "label": "LogEntryFieldColumn", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryFieldColumnProps", - " & { children?: React.ReactNode; }) => JSX.Element" + " & { children?: React.ReactNode; } & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -475,9 +491,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -527,9 +543,9 @@ "label": "LogEntryMessageColumn", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryMessageColumnProps", - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -544,9 +560,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -561,7 +577,7 @@ "label": "LogEntryRowWrapper", "description": [], "signature": [ - "(props: StyledComponentPropsWithAs | keyof JSX.IntrinsicElements, ", + "React.ForwardRefExoticComponent<(Pick & Partial>, \"theme\"> & { theme?: ", { "pluginId": "@kbn/react-kibana-context-styled", "scope": "common", @@ -569,7 +585,15 @@ "section": "def-common.EuiTheme", "text": "EuiTheme" }, - ", { role: \"row\"; } & LogEntryRowWrapperProps, \"role\">) => JSX.Element" + " | undefined; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol> | Pick & Partial>, \"theme\"> & { theme?: ", + { + "pluginId": "@kbn/react-kibana-context-styled", + "scope": "common", + "docId": "kibKbnReactKibanaContextStyledPluginApi", + "section": "def-common.EuiTheme", + "text": "EuiTheme" + }, + " | undefined; } & { children?: React.ReactNode; } & { as?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; forwardedAs?: React.ComponentType | keyof JSX.IntrinsicElements | undefined; }, string | number | symbol>) & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -584,9 +608,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -601,9 +625,9 @@ "label": "LogEntryTimestampColumn", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", "LogEntryTimestampColumnProps", - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -618,9 +642,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -731,7 +755,7 @@ "label": "LogStream", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent<", { "pluginId": "logsShared", "scope": "public", @@ -739,7 +763,7 @@ "section": "def-public.LogStreamProps", "text": "LogStreamProps" }, - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -754,9 +778,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -1041,9 +1065,19 @@ "label": "ScrollableLogTextStreamView", "description": [], "signature": [ - "(props: ", + "React.ForwardRefExoticComponent JSX.Element" + " & React.RefAttributes<", + { + "pluginId": "logsShared", + "scope": "public", + "docId": "kibLogsSharedPluginApi", + "section": "def-public.ScrollableLogTextStreamView", + "text": "ScrollableLogTextStreamView" + }, + ">, \"key\" | \"css\" | keyof ", + "ScrollableLogTextStreamViewProps", + "> & React.RefAttributes<{}>>" ], "path": "x-pack/plugins/logs_shared/public/index.ts", "deprecated": false, @@ -1058,9 +1092,9 @@ "label": "props", "description": [], "signature": [ - "TComponent extends React.JSXElementConstructor ? P : TComponent extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[TComponent] : {}" + "P" ], - "path": "x-pack/plugins/logs_shared/common/dynamic.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 1fceb514228c1..6ecee6f2af125 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 302 | 0 | 287 | 32 | +| 302 | 0 | 276 | 32 | ## Client diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 0060ced3aaf9c..69a8e87223b10 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 029a9163d1f47..908941ebbbebd 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 8e3425a5e1c6e..88e7b590acf99 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 2c759ff880014..4f1be62654e4e 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index cccdc88b9c3be..9d901637d5f0b 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 71b88e86bb231..b2ad4d7200d0d 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index d362a37ac33fd..6aafb6a96c843 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index a01fb6050df0f..f0cb69e99588b 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 6fa72ff89b482..4ef59e1deaf1a 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index d2f00df31af3c..b9bd844d89fde 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 5b71a0706082f..ff2485cd8100b 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 3a24b760e1996..113093acec9c8 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 612252e480ab6..87d9c483905f9 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 6b16e970cea5c..be493c98c7bee 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 984f137b14d61..d6f4a79048772 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 89ae145317a0b..e074f6ea58119 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 4f117ca4d9168..1fe605c8e5778 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index df3c0245561b9..56aa5ac10931d 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 79e8b8bb50eda..0bffbc557cae5 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index e01f50d05ba60..ee7bb754a8009 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 79420 | 230 | 68016 | 1713 | +| 79428 | 230 | 68011 | 1713 | ## Plugin Directory @@ -57,7 +57,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 268 | 0 | 249 | 1 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 109 | 0 | 106 | 11 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3233 | 31 | 2582 | 23 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3234 | 31 | 2583 | 23 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | @@ -119,14 +119,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 609 | 3 | 416 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 658 | 0 | 557 | 61 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 661 | 0 | 560 | 61 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | A dashboard panel for creating links to dashboards or external links. | 57 | 0 | 57 | 6 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 224 | 0 | 96 | 51 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin provides a LogExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption. | 87 | 0 | 87 | 16 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 302 | 0 | 287 | 32 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 302 | 0 | 276 | 32 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 45 | 0 | 45 | 7 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 261 | 0 | 260 | 28 | @@ -214,7 +214,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the vislib visualizations. These are the classical area/line/bar, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 1 | 0 | 1 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 52 | 0 | 50 | 5 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 840 | 12 | 809 | 19 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 839 | 12 | 808 | 19 | | watcher | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | ## Package Directory @@ -660,7 +660,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 4 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 0 | 3 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 16 | 0 | 6 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 144 | 0 | 144 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 4 | 0 | 4 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index f50ec22643faf..1a4155fbb34cf 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index dfcd8964ad64a..70ef6e4ba6cbb 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 21794765c67c5..25827b68a313e 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 039cc0527470f..7aa929326f9f9 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 6a71ce4967b7c..a068010e5cb5e 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 73f5d2a51e23a..ea5801294b182 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 186f261e3eaf2..472324c7e44d1 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 3e295c6a7c76a..1f6b434c25fc0 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 9ff0a98a1275f..ae3f0cb5c26e0 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 0f3e69e88070d..0db31ed214383 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 32f22ec006445..52be2bc8717ef 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 98db4c8a7249f..8b23f6635d951 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 129d7b2084a5c..0965925c310b6 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 471a02ff6a03a..786f6d84e69b0 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 0d74aefb49100..8d7f73459618e 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 078d01b2f6ed0..99af708eafc64 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 09a9f83ea0fd5..767fed55d9045 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index aa75dd857b0f6..e1fc5b6b401dd 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 2b6709c8f75d7..a6d86e774f9f5 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 1f659475a583a..572d4c3a7c987 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index a41719a129004..ce903e5e8f7ae 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index d4959ed193464..2b8eb75156b0e 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 8aa2115813539..38a2477b9c1d2 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 180409fa5cf85..b441461b15264 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 8e8b3e82e6490..a7830184f502d 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 677f7e44db465..6edeb2776f852 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 64446108aae31..ab1a726fabedf 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index e2ff600becb52..bee5f400998b2 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index b8467fd4201f0..116f9a4810b70 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 9a8cbca3f5137..dc883508b0e0c 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 0389525064ba6..7e0c4bead3f3e 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 0a916c643b125..1c54e7a3255ea 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 25328ad652062..99dce4368cc50 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 3203980b8e38d..8363d8df90aa2 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index f191827f41cf4..7bb7b290ff2b1 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index acb8db18002ea..68c9620404b9a 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 24a3a0c34c62a..2a93b5e91bc49 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 149d4c67c1a5e..b5fab3dacca75 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 9cb73e6b86929..afa2e9fb71ee9 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 9833aa148ddc5..6f8b801c6c1d3 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index f1aa1c9b7e491..57e515c9c0c14 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index b034318f619dd..2ea6a3dce1817 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 6fd38bafc7d4d..dea2b9d0043d5 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 033c2d0cdd6b4..a581520614a3f 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index d9e0be161951a..1daf77ba98b13 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 42d4ee8830214..f1b90466810db 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 22f984d3412f8..c80caaf4d2b28 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 243bed4508382..a4c452e48ee5e 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index d5faac0f9a06c..01a52a38d14c2 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 179aaf38aaa91..6a2464c808d9e 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 0fc3ccd834ca6..a621dfe17c0af 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index a82f75d596926..51ce63072255a 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 6f68ff504ff38..3c77b999fc2cc 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 5232a1741fb84..bda06b6d49203 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 4da2262ce2286..a97803bd7a7c6 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index b5e10f1824794..4b6a914912f7c 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index d900a62d90798..3167790c2e116 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 0815e6f8ac441..c36d7e3f12794 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 68606a61c2b40..6ea7465b03647 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 56fe62962c325..e3f4e029130ff 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 6cfb1b1d8445a..26df9a9e5f0cf 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -2874,52 +2874,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "visualizations", - "id": "def-public.HasVisualizeConfig", - "type": "Interface", - "tags": [], - "label": "HasVisualizeConfig", - "description": [], - "path": "src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "visualizations", - "id": "def-public.HasVisualizeConfig.getVis", - "type": "Function", - "tags": [], - "label": "getVis", - "description": [], - "signature": [ - "() => ", - { - "pluginId": "visualizations", - "scope": "public", - "docId": "kibVisualizationsPluginApi", - "section": "def-public.Vis", - "text": "Vis" - }, - "<", - { - "pluginId": "visualizations", - "scope": "common", - "docId": "kibVisualizationsPluginApi", - "section": "def-common.VisParams", - "text": "VisParams" - }, - ">" - ], - "path": "src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "visualizations", "id": "def-public.HistogramParams", @@ -6529,6 +6483,44 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-public.HasVisualizeConfig", + "type": "Type", + "tags": [], + "label": "HasVisualizeConfig", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.HasType", + "text": "HasType" + }, + "<\"visualization\"> & { getVis: () => ", + { + "pluginId": "visualizations", + "scope": "public", + "docId": "kibVisualizationsPluginApi", + "section": "def-public.Vis", + "text": "Vis" + }, + "<", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.VisParams", + "text": "VisParams" + }, + ">; }" + ], + "path": "src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-public.SAVED_OBJECTS_LIMIT_SETTING", diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index aea5b76306c32..62bbcf801ed61 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-01-29 +date: 2024-01-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 840 | 12 | 809 | 19 | +| 839 | 12 | 808 | 19 | ## Client diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index d956cae5ba946..5bee773fce8cc 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -63,10 +63,8 @@ xpack.fleet.internal.registry.excludePackages: [ 'profiler_agent', ] -## Required for force installation of APM Package +## Required for force installation of integration packages xpack.fleet.packages: - - name: apm - version: latest # fleet_server package installed to publish agent metrics - name: fleet_server version: latest diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 5e5681047e938..f2602029c2dd2 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -980,7 +980,7 @@ Alerting:: APM:: * Adds KQL filtering in APM rules ({kibana-pull}163825[#163825]). * Make service group saved objects exportable ({kibana-pull}163569[#163569]). -* Added ability to manage Cross-Cluster API keys ({kibana-pull}162363[#162363]). +* Added ability to manage cross-cluster API keys ({kibana-pull}162363[#162363]). * Enable Trace Explorer by default ({kibana-pull}162308[#162308]). * Adds error.grouping_name to group alerts in Error Count rule ({kibana-pull}161810[#161810]). * Adds query to check for overflow bucket in service groups ({kibana-pull}159990[#159990]). diff --git a/docs/api/data-views.asciidoc b/docs/api/data-views.asciidoc index cf9524d4fdf30..ff768fd1a260e 100644 --- a/docs/api/data-views.asciidoc +++ b/docs/api/data-views.asciidoc @@ -16,6 +16,8 @@ The following data views APIs are available: ** <> to create data view ** <> to partially updated data view ** <> to delete a data view + ** <> to preview a data view reference swap + ** <> to perform a data view reference swap * Default data views ** <> to retrieve a default data view ** <> to set a default data view @@ -33,6 +35,8 @@ include::data-views/get.asciidoc[] include::data-views/create.asciidoc[] include::data-views/update.asciidoc[] include::data-views/delete.asciidoc[] +include::data-views/swap_references_preview.asciidoc[] +include::data-views/swap_references.asciidoc[] include::data-views/default-get.asciidoc[] include::data-views/default-set.asciidoc[] include::data-views/update-fields.asciidoc[] diff --git a/docs/api/data-views/swap_references.asciidoc b/docs/api/data-views/swap_references.asciidoc new file mode 100644 index 0000000000000..26f6f9aada21a --- /dev/null +++ b/docs/api/data-views/swap_references.asciidoc @@ -0,0 +1,84 @@ +[[data-views-api-swap-references]] +=== Swap references data view API +++++ +Swap references +++++ + +Swap saved object references + +[WARNING] +==== +Misuse can break large numbers of saved objects! Practicing with a backup is recommended. +==== + +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/src/plugins/data_views/docs/openapi[open API specification]. +==== + +[[data-views-api-swap-references-request]] +==== Request + +`POST :/api/data_views/swap_references` + +`POST :/s//api/data_views/swap_references` + + +[[data-views-api-swap-references-request-body]] +==== Request body + +`fromId`:: +(Required, string) Saved object reference to change. + +`toId`:: +(Required, string) New saved object reference value to replace the old. + +`delete`:: + (Optional, boolean) Deletes referenced saved object if all references are removed. + +`fromType`:: + (Optional, string) Specify the type of the saved object reference to alter. Default is `index-pattern` for data view. + +`forId`:: +(Optional, string or string[]) Limit the affected saved objects to one or more by IDs. + +`forType`:: + (Optional, string) Limit the affected saved objects by type. + +[[data-views-api-swap-references-errors-codes]] +==== Response code + +`200`:: +Indicates a successful call. + +[[data-views-api-swap-references-example]] +==== Examples + +Swap references to data view id "abcd-efg" with "xyz-123": + +[source,sh] +-------------------------------------------------- +$ curl -X api/data_views/swap_references +{ + "fromId" : "abcd-efg", + "toId" : "xyz-123", + "delete" : true // optional, removes data view which is no longer referenced +} + +-------------------------------------------------- +// KIBANA + +The API returns a list of affected saved objects: + +[source,sh] +-------------------------------------------------- +{ + result: [{ id: "123", type: "visualization" }], + deleteStatus: { + remainingRefs: 0, + deletePerformed: true + } +} +-------------------------------------------------- + diff --git a/docs/api/data-views/swap_references_preview.asciidoc b/docs/api/data-views/swap_references_preview.asciidoc new file mode 100644 index 0000000000000..16581045aaa35 --- /dev/null +++ b/docs/api/data-views/swap_references_preview.asciidoc @@ -0,0 +1,74 @@ +[[data-views-api-swap-references-preview]] +=== Swap references preview data view API +++++ +Swap references preview +++++ + +Swap saved object references preview + +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/src/plugins/data_views/docs/openapi[open API specification]. +==== + +[[data-views-api-swap-references-preview-request]] +==== Request + +`POST :/api/data_views/swap_references/_preview` + +`POST :/s//api/data_views/swap_references/_preview` + + +[[data-views-api-swap-references-preview-request-body]] +==== Request body + +`fromId`:: +(Required, string) Saved object reference to change. + +`toId`:: +(Required, string) New saved object reference value to replace the old. + +`delete`:: + (Optional, boolean) Deletes referenced saved object if all references are removed. + +`fromType`:: + (Optional, string) Specify the type of the saved object reference to alter. Default is `index-pattern` for data view. + +`forId`:: +(Optional, string or string[]) Limit the affected saved objects to one or more by IDs. + +`forType`:: + (Optional, string) Limit the affected saved objects by type. + +[[data-views-api-swap-references-preview-errors-codes]] +==== Response code + +`200`:: +Indicates a successful call. + +[[data-views-api-swap-references-preview-example]] +==== Examples + +Preview swapping references to data view id "abcd-efg" with "xyz-123": + +[source,sh] +-------------------------------------------------- +$ curl -X api/data_views/swap_references/_preview +{ + "fromId" : "abcd-efg", + "toId" : "xyz-123" +} + +-------------------------------------------------- +// KIBANA + +The API returns a list of affected saved objects: + +[source,sh] +-------------------------------------------------- +{ + result: [{ id: "123", type: "visualization" }], +} +-------------------------------------------------- + diff --git a/docs/apm/advanced-queries.asciidoc b/docs/apm/advanced-queries.asciidoc index 8aac22c742433..c74615f40a647 100644 --- a/docs/apm/advanced-queries.asciidoc +++ b/docs/apm/advanced-queries.asciidoc @@ -57,7 +57,7 @@ and *Discover* supports all of the example APM app queries shown on this page. [[discover-queries]] ==== Discover queries -One example where you may want to make use of *Discover*, +One example where you may want to make use of *Discover* is to view _all_ transactions for an endpoint instead of just a sample. TIP: Starting in v7.6, you can view ten samples per bucket in the APM app, instead of just one. @@ -77,7 +77,7 @@ that took between 13 and 14 milliseconds. Here's what Discover returns: image::apm/images/advanced-discover.png[View all transactions in bucket] You can now explore the data until you find a specific transaction that you're interested in. -Copy that transaction's `transaction.id`, and paste it into the APM app to view the data in the context of the APM app: +Copy that transaction's `transaction.id` and paste it into the APM app to view the data in the context of the APM app: [role="screenshot"] image::apm/images/specific-transaction-search.png[View specific transaction in apm app] diff --git a/docs/apm/filters.asciidoc b/docs/apm/filters.asciidoc index 8ff39e3c1dcf0..e3d085b771a85 100644 --- a/docs/apm/filters.asciidoc +++ b/docs/apm/filters.asciidoc @@ -7,8 +7,8 @@ ++++ Global filters are ways you can filter data across the APM app based on a specific -time range or environment. They are available in the Services, Transactions, Errors, -Metrics, and Traces views, and any filter applied will persist as you move between pages. +time range or environment. When viewing a specific service, the filter persists +as you move between tabs. [role="screenshot"] image::apm/images/global-filters.png[Global filters available in the APM app in Kibana] diff --git a/docs/apm/infrastructure.asciidoc b/docs/apm/infrastructure.asciidoc index 8ca919ffca6c4..ff6343061ca24 100644 --- a/docs/apm/infrastructure.asciidoc +++ b/docs/apm/infrastructure.asciidoc @@ -4,7 +4,7 @@ beta::[] -The *Infrastructure* tab provides information about the containers, pods, and hosts, +The *Infrastructure* tab provides information about the containers, pods, and hosts that the selected service is linked to. [role="screenshot"] @@ -12,4 +12,4 @@ image::apm/images/infra.png[Example view of the Infrastructure tab in APM app in IT ops and software reliability engineers (SREs) can use this tab to quickly find a service's underlying infrastructure resources when debugging a problem. -Knowing what infrastructure is related to a service allows you to remediate issues by restarting, killing hanging instances, changing configuration, rolling back deployments, scaling up, scaling out, etc. \ No newline at end of file +Knowing what infrastructure is related to a service allows you to remediate issues by restarting, killing hanging instances, changing configuration, rolling back deployments, scaling up, scaling out, and so on. \ No newline at end of file diff --git a/docs/apm/machine-learning.asciidoc b/docs/apm/machine-learning.asciidoc index 8f82cb2a00f10..f01cdf70b6e05 100644 --- a/docs/apm/machine-learning.asciidoc +++ b/docs/apm/machine-learning.asciidoc @@ -10,7 +10,7 @@ The Machine learning integration initiates a new job predefined to calculate ano With this integration, you can quickly pinpoint anomalous transactions and see the health of any upstream and downstream services. -Machine learning jobs are created per environment, and are based on a service's average response time. +Machine learning jobs are created per environment and are based on a service's average response time. Because jobs are created at the environment level, you can add new services to your existing environments without the need for additional machine learning jobs. @@ -40,7 +40,7 @@ To enable machine learning anomaly detection: . From the Services overview, Traces overview, or Service Map tab, select **Anomaly detection**. -. Click **Create ML Job**. +. Click **Create Job**. . Machine learning jobs are created at the environment level. Select all of the service environments that you want to enable anomaly detection in. @@ -50,7 +50,7 @@ Anomalies will surface for all services and transaction types within the selecte That's it! After a few minutes, the job will begin calculating results; it might take additional time for results to appear on your service maps. -Existing jobs can be managed in *Machine Learning jobs management*. +To manage existing jobs, click **Manage jobs**. [float] [[warning-ml-integration]] @@ -66,7 +66,7 @@ image::apm/images/apm-anomaly-alert.png[Example view of anomaly alert in the APM [[unkown-ml-integration]] === Unknown service health -After enabling anomaly detection, service health may display as "Unknown". There are three reasons why this can occur: +After enabling anomaly detection, service health may display as "Unknown". Here are some reasons why this can occur: 1. No machine learning job exists. See <> to enable anomaly detection and create a machine learning job. 2. There is no machine learning data for the job. If you just created the machine learning job you'll need to wait a few minutes for data to be available. Alternatively, if the service or its enviroment are new, you'll need to wait for more trace data. diff --git a/docs/apm/service-maps.asciidoc b/docs/apm/service-maps.asciidoc index a0c9dda2188cb..85c8efa4adb5d 100644 --- a/docs/apm/service-maps.asciidoc +++ b/docs/apm/service-maps.asciidoc @@ -62,9 +62,8 @@ This can be useful if you have two or more services, in separate environments, b Use the environment drop-down to only see the data you're interested in, like `dev` or `production`. If there's a specific service that interests you, select that service to highlight its connections. -Clicking **Focus map** will refocus the map on that specific service and lock the connection highlighting. -From here, select **Service Details**, or click on the **Transaction** tab to jump to the Transaction overview -for the selected service. +Click **Focus map** to refocus the map on the selected service and lock the connection highlighting. +From here, select **Service Details**, or click the **Transactions** tab to jump to the Transaction overview for the selected service. You can also use the tabs at the top of the page to easily jump to the **Errors** or **Metrics** overview. [role="screenshot"] @@ -74,7 +73,7 @@ image::apm/images/service-maps-java.png[Example view of service maps in the APM [[service-map-anomaly-detection]] === Anomaly detection with machine learning -Machine learning jobs can be created to calculate anomaly scores on APM transaction durations within the selected service. +You can create machine learning jobs to calculate anomaly scores on APM transaction durations within the selected service. When these jobs are active, service maps will display a color-coded anomaly indicator based on the detected anomaly score: [horizontal] @@ -85,7 +84,7 @@ image:apm/images/red-service.png[APM red service]:: Max anomaly score **≥75**. [role="screenshot"] image::apm/images/apm-service-map-anomaly.png[Example view of anomaly scores on service maps in the APM app] -If an anomaly has been detected, click *view anomalies* to view the anomaly detection metric viewer in the Machine learning app. +If an anomaly has been detected, click *View anomalies* to view the anomaly detection metric viewer in the Machine learning app. This time series analysis will display additional details on the severity and time of the detected anomalies. To learn how to create a machine learning job, see <>. diff --git a/docs/apm/services.asciidoc b/docs/apm/services.asciidoc index 7ce3354ecbf7e..c4deeb7e40322 100644 --- a/docs/apm/services.asciidoc +++ b/docs/apm/services.asciidoc @@ -33,9 +33,14 @@ image::apm/images/apm-service-group.png[Example view of service group in the APM To enable Service groups, open {kib} and navigate to **Stack Management** > **Advanced Settings** > **Observability**, and enable the **Service groups feature**. -To create a service group, navigate to **Observability** > **APM** > **Services** and select **Create group**. -Specify a name, color, and description. -Then, using the <>, specify a query to select services for the group. +To create a service group: + +. Navigate to **Observability** > **APM** > **Services**. +. Switch to **Service groups**. +. Click **Create group**. +. Specify a name, color, and description. +. Click **Select services**. +. Specify a <> query to select services for the group. Services that match the query within the last 24 hours will be assigned to the group. [NOTE] @@ -54,4 +59,3 @@ Not sure where to get started? Here are some sample queries you can build from: * Group services by environment--in this example, "production": `service.environment : "production"` * Group services by name--this example groups those that end in "beat": `service.name : *beat` (matches services named "Auditbeat", "Heartbeat", "Filebeat", etc.) -* Group services with a high transaction duration in the last 24 hours: `transaction.duration.us >= 50000000` diff --git a/docs/apm/transactions.asciidoc b/docs/apm/transactions.asciidoc index b0a1c9ee858de..284d28c7b60c0 100644 --- a/docs/apm/transactions.asciidoc +++ b/docs/apm/transactions.asciidoc @@ -8,7 +8,7 @@ APM agents automatically collect performance metrics on HTTP requests, database [role="screenshot"] image::apm/images/apm-transactions-overview.png[Example view of transactions table in the APM app in Kibana] -The *Latency*, *Throughput*, *Failed transaction rate*, *Average duration by span type*, and *Cold start rate* +The *Latency*, *Throughput*, *Failed transaction rate*, *Time spent by span type*, and *Cold start rate* charts display information on all transactions associated with the selected service: *Latency*:: @@ -38,7 +38,7 @@ These spans will set `event.outcome=failure` and increase the failed transaction If there is no HTTP status, both transactions and spans are considered successful unless an error is reported. ==== -*Average duration by span type*:: +*Time spent by span type*:: Visualize where your application is spending most of its time. For example, is your app spending time in external calls, database processing, or application code execution? + @@ -106,10 +106,10 @@ image::apm/images/apm-transactions-overview.png[Example view of response time di [[transaction-duration-distribution]] ==== Latency distribution -A plot of all transaction durations for the given time period. -The screenshot below shows a typical distribution, +The latency distribution shows a plot of all transaction durations for the given time period. +The following screenshot shows a typical distribution and indicates most of our requests were served quickly -- awesome! -It's the requests on the right, the ones taking longer than average, that we probably need to focus on. +The requests on the right are taking longer than average; we probably need to focus on them. [role="screenshot"] image::apm/images/apm-transaction-duration-dist.png[Example view of latency distribution graph] diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index fe9a0d40f5d23..c3ffa6339f320 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -648,7 +648,7 @@ using the CURL scripts in the scripts folder. |{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/logs_explorer/README.md[logsExplorer] -|This plugin is home to the component and related types. It implements several of the underlying concepts that the Observability Log Explorer app builds upon. +|This plugin is home to the component and related types. It implements several of the underlying concepts that the Observability Logs Explorer app builds upon. |{kib-repo}blob/{branch}/x-pack/plugins/logs_shared/README.md[logsShared] diff --git a/docs/user/ml/images/ml-data-comparison.png b/docs/user/ml/images/ml-data-comparison.png deleted file mode 100644 index 428d625538603..0000000000000 Binary files a/docs/user/ml/images/ml-data-comparison.png and /dev/null differ diff --git a/docs/user/ml/images/ml-data-drift.png b/docs/user/ml/images/ml-data-drift.png new file mode 100644 index 0000000000000..ee537e8b8768f Binary files /dev/null and b/docs/user/ml/images/ml-data-drift.png differ diff --git a/docs/user/ml/index.asciidoc b/docs/user/ml/index.asciidoc index 4f25e0aa45c78..870022e05512e 100644 --- a/docs/user/ml/index.asciidoc +++ b/docs/user/ml/index.asciidoc @@ -32,19 +32,19 @@ NOTE: There are limitations in {ml-features} that affect {kib}. For more information, refer to {ml-docs}/ml-limitations.html[{ml-cap}]. [discrete] -[[data-comparison-view]] -== Data comparison +[[data-drift-view]] +== Data drift preview::[] -You can find the data comparison view in **{ml-app}** > *{data-viz}* in {kib}. -The data comparison view shows you the differences in each field for two +You can find the data drift view in **{ml-app}** > *{data-viz}* in {kib}. +The data drift view shows you the differences in each field for two different time ranges in a given {data-source}. The view helps you to visualize the changes in your data over time and enables you to understand its behavior better. [role="screenshot"] -image::user/ml/images/ml-data-comparison.png[Data comparison view for {kib} Sample Data Flights ] +image::user/ml/images/ml-data-drift.png[Data drift view in {kib}] Select a {data-source} that you want to analyze, then select a time range for the reference and the comparison data in the appearing histogram chart. You can diff --git a/docs/user/security/api-keys/index.asciidoc b/docs/user/security/api-keys/index.asciidoc index eda187ed9096c..5b3dd206b5408 100644 --- a/docs/user/security/api-keys/index.asciidoc +++ b/docs/user/security/api-keys/index.asciidoc @@ -9,9 +9,9 @@ For example, if you extract data from an {es} cluster on a daily basis, you migh You can use {kib} to manage your different API keys: -* Personal API key: allows external services to access the Elastic Stack on behalf of a user. -* Cross-Cluster API key: allows remote clusters to connect to your local cluster. -* Managed API key: created and managed by Kibana to correctly run background tasks. +* User API key: allows external services to access the Elastic Stack on behalf of a user. +* Cross-cluster API key: allows other clusters to connect to this cluster. +* Managed API key: created and managed by Kibana to run background tasks. To manage API keys, open the main menu, then click *Stack Management > Security > API Keys*. @@ -24,7 +24,7 @@ image:images/api-keys.png["API Keys UI"] * To use API keys in {kib}, you must have the `manage_security`, `manage_api_key`, or the `manage_own_api_key` cluster privileges. * To delete API keys, you must have the `manage_api_key` or `manage_own_api_key` privileges. -* To create or update a *personal API key*, you must have the `manage_api_key` or the `manage_own_api_key` privilege. +* To create or update a *user API key*, you must have the `manage_api_key` or the `manage_own_api_key` privilege. * To create or update a *cross-cluster API key*, you must have the `manage_security` privilege and an Enterprise license. * To have a read-only view on the API keys, you must have access to the page and the `read_security` cluster privilege. @@ -40,7 +40,7 @@ To create an API key, open the main menu, then click *Stack Management > Securit image:images/create-ccr-api-key.png["Create API Key UI"] -Refer to the {ref}/security-api-create-api-key.html[create API key] documentation to learn more about creating personal API keys. +Refer to the {ref}/security-api-create-api-key.html[create API key] documentation to learn more about creating user API keys. Refer to the {ref}/security-api-create-cross-cluster-api-key.html[create cross-cluster API key] documentation to learn more about creating cross-cluster API keys. @@ -50,7 +50,7 @@ Refer to the {ref}/security-api-create-cross-cluster-api-key.html[create cross-c To update an API key, open the main menu, click *Stack Management > Security > API Keys*, and then click on the name of the key. You cannot update the name or the type of API key. -Refer to the {ref}/security-api-update-api-key.html[update API key] documentation to learn more about updating personal API keys. +Refer to the {ref}/security-api-update-api-key.html[update API key] documentation to learn more about updating user API keys. Refer to the {ref}/security-api-update-cross-cluster-api-key.html[update cross-cluster API key] documentation to learn more about updating cross-cluster API keys. diff --git a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx index cfa672748f7ff..7da5f68e792f8 100644 --- a/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx +++ b/examples/response_stream/public/containers/app/pages/page_reducer_stream/index.tsx @@ -105,7 +105,7 @@ export const PageReducerStream: FC = () => {
- + {buttonLabel} diff --git a/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx b/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx index 1656eb26c84da..7075656dc0167 100644 --- a/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx +++ b/examples/response_stream/public/containers/app/pages/page_simple_string_stream/index.tsx @@ -66,7 +66,7 @@ export const PageSimpleStringStream: FC = () => {
- + {buttonLabel} diff --git a/package.json b/package.json index fcd29bece4829..b3e0fe4625e9e 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.9.1-canary.1", "@elastic/ems-client": "8.5.1", - "@elastic/eui": "92.1.1", + "@elastic/eui": "92.2.1", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", @@ -1644,7 +1644,7 @@ "rxjs-marbles": "^7.0.1", "sass-embedded": "^1.70.0", "sass-loader": "^10.5.1", - "selenium-webdriver": "^4.16.0", + "selenium-webdriver": "^4.17.0", "sharp": "0.32.6", "simple-git": "^3.16.0", "sinon": "^7.4.2", diff --git a/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx b/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx index 5fdc4439136f9..549b02e4a8f32 100644 --- a/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx +++ b/packages/core/overlays/core-overlays-browser-internal/src/banners/user_banner_service.tsx @@ -75,7 +75,7 @@ export class UserBannerService { {content.trim()} - banners.remove(id!)}> + banners.remove(id!)}> { 'error.grouping_name': getErrorGroupingKey(message), }); } - error({ message, type }: { message: string; type?: string }) { + error({ message, type, culprit }: { message: string; type?: string; culprit?: string }) { return new ApmError({ ...this.fields, 'error.exception': [{ message, ...(type ? { type } : {}) }], 'error.grouping_name': getErrorGroupingKey(message), + 'error.culprit': culprit, }); } diff --git a/packages/kbn-apm-synthtrace/src/scenarios/helpers/exception_types.ts b/packages/kbn-apm-synthtrace/src/scenarios/helpers/exception_types.ts new file mode 100644 index 0000000000000..a7e7ba34c4846 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/helpers/exception_types.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. + */ + +export const exceptionTypes = [ + 'ProgrammingError', + 'ProtocolError', + 'RangeError', + 'ReadTimeout', + 'ReadTimeoutError', + 'ReferenceError', + 'RemoteDisconnected', + 'RequestAbortedError', + 'ResponseError (action_request_validation_exception)', + 'ResponseError (illegal_argument_exception)', + 'ResponseError (index_not_found_exception)', + 'ResponseError (index_template_missing_exception)', + 'ResponseError (resource_already_exists_exception)', + 'ResponseError (resource_not_found_exception)', + 'ResponseError (search_phase_execution_exception)', + 'ResponseError (security_exception)', + 'ResponseError (transport_serialization_exception)', + 'ResponseError (version_conflict_engine_exception)', + 'ResponseError (x_content_parse_exception)', + 'ResponseError', + 'SIGTRAP', + 'SocketError', + 'SpawnError', + 'SyntaxError', + 'SyscallError', + 'TimeoutError', + 'TimeoutError', + 'TypeError', +]; + +export function getExceptionTypeForIndex(index: number) { + return exceptionTypes[index % exceptionTypes.length]; +} diff --git a/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts b/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts index 7532b3dc9477c..4227f003771ef 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/logs_and_metrics.ts @@ -120,7 +120,10 @@ const scenario: Scenario = async (runOptions) => { .failure() .errors( instance - .error({ message: '[ResponseError] index_not_found_exception' }) + .error({ + message: '[ResponseError] index_not_found_exception', + type: 'ResponseError', + }) .timestamp(timestamp + 50) ) ); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_dependencies.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_dependencies.ts new file mode 100644 index 0000000000000..61ecb7832f0f3 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_dependencies.ts @@ -0,0 +1,73 @@ +/* + * Copyright 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 { ApmFields, Instance } from '@kbn/apm-synthtrace-client'; +import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; +import { random, times } from 'lodash'; +import { Scenario } from '../cli/scenario'; +import { RunOptions } from '../cli/utils/parse_run_cli_flags'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; + +const ENVIRONMENT = getSynthtraceEnvironment(__filename); +const NUMBER_OF_DEPENDENCIES_PER_SERVICE = 2000; +const NUMBER_OF_SERVICES = 1; + +const scenario: Scenario = async (runOptions: RunOptions) => { + return { + generate: ({ range, clients: { apmEsClient } }) => { + const instances = times(NUMBER_OF_SERVICES).map((index) => + service({ + name: `synthtrace-high-cardinality-${index}`, + environment: ENVIRONMENT, + agentName: 'java', + }).instance(`java-instance-${index}`) + ); + + const instanceDependencies = (instance: Instance, id: string) => { + const throughput = random(1, 60); + const childLatency = random(10, 100_000); + const parentLatency = childLatency + random(10, 10_000); + + const failureRate = random(0, 100); + + return range.ratePerMinute(throughput).generator((timestamp) => { + const child = instance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .destination(`elasticsearch/${id}`) + .timestamp(timestamp) + .duration(childLatency); + + const span = instance + .transaction({ transactionName: 'GET /java' }) + .timestamp(timestamp) + .duration(parentLatency) + .success() + .children(Math.random() * 100 > failureRate ? child.success() : child.failure()); + + return span; + }); + }; + + return withClient( + apmEsClient, + instances.flatMap((instance, i) => + times(NUMBER_OF_DEPENDENCIES_PER_SERVICE) + .map((j) => instanceDependencies(instance, `${i + 1}.${j + 1}`)) + .flat() + ) + ); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts index 7948688610f56..6f9849615b78e 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_errors.ts @@ -9,13 +9,13 @@ import { ApmFields, apm } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; import { withClient } from '../lib/utils/with_client'; +import { getExceptionTypeForIndex } from './helpers/exception_types'; import { getRandomNameForIndex } from './helpers/random_names'; const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async (runOptions) => { const { logger } = runOptions; - const severities = ['critical', 'error', 'warning', 'info', 'debug', 'trace']; return { @@ -23,7 +23,11 @@ const scenario: Scenario = async (runOptions) => { const transactionName = 'DELETE /api/orders/{id}'; const instance = apm - .service({ name: `synth-node`, environment: ENVIRONMENT, agentName: 'nodejs' }) + .service({ + name: `synthtrace-high-cardinality-0`, + environment: ENVIRONMENT, + agentName: 'java', + }) .instance('instance'); const failedTraceEvents = range @@ -38,7 +42,13 @@ const scenario: Scenario = async (runOptions) => { .duration(1000) .failure() .errors( - instance.error({ message: errorMessage, type: 'My Type' }).timestamp(timestamp + 50) + instance + .error({ + message: errorMessage, + type: getExceptionTypeForIndex(index), + culprit: 'request (node_modules/@elastic/transport/src/Transport.ts)', + }) + .timestamp(timestamp + 50) ); }); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts index 4774839c71727..8c57a37177f85 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_instances.ts @@ -18,8 +18,7 @@ const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async ({ logger, scenarioOpts = { instances: 2000 } }) => { const numInstances = scenarioOpts.instances; const agentVersions = ['2.1.0', '2.0.0', '1.15.0', '1.14.0', '1.13.1']; - const language = 'go'; - const serviceName = 'synth-many-instances'; + const language = 'java'; const transactionName = 'GET /order/{id}'; return { @@ -29,7 +28,7 @@ const scenario: Scenario = async ({ logger, scenarioOpts = { instance const randomName = getRandomNameForIndex(index); return apm .service({ - name: serviceName, + name: 'synthtrace-high-cardinality-0', environment: ENVIRONMENT, agentName: language, }) @@ -51,13 +50,15 @@ const scenario: Scenario = async ({ logger, scenarioOpts = { instance return !generateError ? span.success() - : span - .failure() - .errors( - instance - .error({ message: `No handler for ${transactionName}` }) - .timestamp(timestamp + 50) - ); + : span.failure().errors( + instance + .error({ + message: `No handler for ${transactionName}`, + type: 'No handler', + culprit: 'request', + }) + .timestamp(timestamp + 50) + ); }); const cpuPct = random(0, 1); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts index 1af9f2f9e3b5a..19da565ab8860 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_services.ts @@ -62,13 +62,15 @@ const scenario: Scenario = async ({ logger, scenarioOpts = { services return !generateError ? span.success() - : span - .failure() - .errors( - instance - .error({ message: `No handler for ${transactionName}` }) - .timestamp(timestamp + 50) - ); + : span.failure().errors( + instance + .error({ + message: `No handler for ${transactionName}`, + type: 'No handler', + culprit: 'request', + }) + .timestamp(timestamp + 50) + ); }); }; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts b/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts index 895d413235512..ce9af03c8e492 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/many_transactions.ts @@ -37,7 +37,11 @@ const scenario: Scenario = async (runOptions) => { generate: ({ range, clients: { apmEsClient } }) => { const instances = times(numServices).map((index) => apm - .service({ name: `synth-go-${index}`, environment: ENVIRONMENT, agentName: 'go' }) + .service({ + name: `synthtrace-high-cardinality-${index}`, + environment: ENVIRONMENT, + agentName: 'java', + }) .instance(`instance-${index}`) ); @@ -60,7 +64,11 @@ const scenario: Scenario = async (runOptions) => { .failure() .errors( instance - .error({ message: '[ResponseError] index_not_found_exception' }) + .error({ + message: '[ResponseError] index_not_found_exception', + type: 'ResponseError', + culprit: 'elasticsearch', + }) .timestamp(timestamp + 50) ) ); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/service_many_dependencies.ts b/packages/kbn-apm-synthtrace/src/scenarios/service_many_dependencies.ts deleted file mode 100644 index a548e55f575a4..0000000000000 --- a/packages/kbn-apm-synthtrace/src/scenarios/service_many_dependencies.ts +++ /dev/null @@ -1,67 +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 { ApmFields, Instance } from '@kbn/apm-synthtrace-client'; -import { service } from '@kbn/apm-synthtrace-client/src/lib/apm/service'; -import { Scenario } from '../cli/scenario'; -import { RunOptions } from '../cli/utils/parse_run_cli_flags'; -import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; -import { withClient } from '../lib/utils/with_client'; - -const ENVIRONMENT = getSynthtraceEnvironment(__filename); -const MAX_DEPENDENCIES = 10000; -const MAX_DEPENDENCIES_PER_SERVICE = 500; -const MAX_SERVICES = 20; - -const scenario: Scenario = async (runOptions: RunOptions) => { - return { - generate: ({ range, clients: { apmEsClient } }) => { - const javaInstances = Array.from({ length: MAX_SERVICES }).map((_, index) => - service(`opbeans-java-${index}`, ENVIRONMENT, 'java').instance(`java-instance-${index}`) - ); - - const instanceDependencies = (instance: Instance, startIndex: number) => { - const rate = range.ratePerMinute(60); - - return rate.generator((timestamp, index) => { - const currentIndex = index % MAX_DEPENDENCIES_PER_SERVICE; - const destination = (startIndex + currentIndex) % MAX_DEPENDENCIES; - - const span = instance - .transaction({ transactionName: 'GET /java' }) - .timestamp(timestamp) - .duration(400) - .success() - .children( - instance - .span({ - spanName: 'GET apm-*/_search', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .destination(`elasticsearch/${destination}`) - .timestamp(timestamp) - .duration(200) - .success() - ); - - return span; - }); - }; - - return withClient( - apmEsClient, - javaInstances.map((instance, index) => - instanceDependencies(instance, (index * MAX_DEPENDENCIES_PER_SERVICE) % MAX_DEPENDENCIES) - ) - ); - }, - }; -}; - -export default scenario; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts index c93e37b4f99b3..1d5ee6f53d63c 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_trace.ts @@ -62,7 +62,10 @@ const scenario: Scenario = async (runOptions) => { .failure() .errors( instance - .error({ message: '[ResponseError] index_not_found_exception' }) + .error({ + message: '[ResponseError] index_not_found_exception', + type: 'ResponseError', + }) .timestamp(timestamp + 50) ) ); diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index e454ccf65f439..719d8a47043ba 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -900,6 +900,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D integrationsLogstash: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-logstash`, integrationsBeats: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-beats`, integrationsConnectorClient: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client`, + integrationsConnectorClientAvailableConnectors: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client#available-connectors`, integrationsConnectorClientRunFromSource: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client#run-from-source`, integrationsConnectorClientRunWithDocker: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client#run-with-docker`, gettingStartedExplore: `${SERVERLESS_ELASTICSEARCH_DOCS}get-started`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index e48f7327984b9..a4a50232d3a55 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -623,6 +623,7 @@ export interface DocLinks { readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; + readonly integrationsConnectorClientAvailableConnectors: string; readonly integrationsConnectorClientRunFromSource: string; readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; diff --git a/packages/kbn-es-archiver/src/es_archiver.ts b/packages/kbn-es-archiver/src/es_archiver.ts index 77d249cf845d1..0b94932c18dc6 100644 --- a/packages/kbn-es-archiver/src/es_archiver.ts +++ b/packages/kbn-es-archiver/src/es_archiver.ts @@ -155,8 +155,8 @@ export class EsArchiver { * * @param name */ - async loadIfNeeded(name: string) { - return await this.load(name, { skipExisting: true }); + async loadIfNeeded(name: string, performance?: LoadActionPerfOptions) { + return await this.load(name, { skipExisting: true, performance }); } /** diff --git a/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts b/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts index 49a43817efc62..8d9196fa8124e 100644 --- a/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts +++ b/packages/kbn-ftr-common-functional-ui-services/services/remote/webdriver.ts @@ -231,8 +231,8 @@ async function attemptToCreateCommand( firefoxOptions.setAcceptInsecureCerts(config.acceptInsecureCerts); if (headlessBrowser === '1') { - // See: https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Headless_mode - firefoxOptions.headless(); + // See: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions + firefoxOptions.addArguments('-headless'); } // Windows issue with stout socket https://github.com/elastic/kibana/issues/52053 diff --git a/packages/kbn-handlebars/index.test.ts b/packages/kbn-handlebars/index.test.ts index ed607db1e0bf6..573834c953ffa 100644 --- a/packages/kbn-handlebars/index.test.ts +++ b/packages/kbn-handlebars/index.test.ts @@ -20,18 +20,226 @@ it('Handlebars.create', () => { describe('Handlebars.compileAST', () => { describe('compiler options', () => { - it('noEscape', () => { - expectTemplate('{{value}}').withInput({ value: '' }).toCompileTo('<foo>'); - - expectTemplate('{{value}}') - .withCompileOptions({ noEscape: false }) - .withInput({ value: '' }) - .toCompileTo('<foo>'); - - expectTemplate('{{value}}') - .withCompileOptions({ noEscape: true }) - .withInput({ value: '' }) - .toCompileTo(''); + describe('noEscape', () => { + describe('basic', () => { + it('should escape a non-nested value with default value set for `noEscape`', () => { + expectTemplate('{{value}}').withInput({ value: '' }).toCompileTo('<foo>'); + }); + + it('should escape a nested value with default value set for `noEscape`', () => { + expectTemplate('{{nested.value}}') + .withInput({ nested: { value: '' } }) + .toCompileTo('<foo>'); + }); + + it('should escape a non-nested value with `noEscape` set to false', () => { + expectTemplate('{{value}}') + .withCompileOptions({ noEscape: false }) + .withInput({ value: '' }) + .toCompileTo('<foo>'); + }); + + it('should escape a nested value with `noEscape` set to false', () => { + expectTemplate('{{nested.value}}') + .withCompileOptions({ noEscape: false }) + .withInput({ nested: { value: '' } }) + .toCompileTo('<foo>'); + }); + + it('should not escape a non-nested value with `noEscape` set to true', () => { + expectTemplate('{{value}}') + .withCompileOptions({ noEscape: true }) + .withInput({ value: '' }) + .toCompileTo(''); + }); + + it('should not escape a nested value with `noEscape` set to true', () => { + expectTemplate('{{nested.value}}') + .withCompileOptions({ noEscape: true }) + .withInput({ nested: { value: '' } }) + .toCompileTo(''); + }); + }); + + describe('known helper', () => { + it('should escape a non-nested value with a known helper and default value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{value}}{{/with}}') + .withInput({ foo: { value: '' } }) + .toCompileTo('<bar>'); + }); + + it('should escape a nested value with a known helper and default value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{nested.value}}{{/with}}') + .withInput({ foo: { nested: { value: '' } } }) + .toCompileTo('<bar>'); + }); + + it('should escape a non-nested value with a known helper and false value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{value}}{{/with}}') + .withCompileOptions({ noEscape: false }) + .withInput({ foo: { value: '' } }) + .toCompileTo('<bar>'); + }); + + it('should escape a nested value with a known helper and false value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{nested.value}}{{/with}}') + .withCompileOptions({ noEscape: false }) + .withInput({ foo: { nested: { value: '' } } }) + .toCompileTo('<bar>'); + }); + + it('should not escape a non-nested value with a known helper and true value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{value}}{{/with}}') + .withCompileOptions({ noEscape: true }) + .withInput({ foo: { value: '' } }) + .toCompileTo(''); + }); + + it('should not escape a nested value with a known helper and true value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{nested.value}}{{/with}}') + .withCompileOptions({ noEscape: true }) + .withInput({ foo: { nested: { value: '' } } }) + .toCompileTo(''); + }); + }); + + describe('unknown helper', () => { + it('should escape a non-nested value with an unknown helper and no value set for `noEscape`', () => { + expectTemplate('{{foo value}}') + .withHelper('foo', (value: string) => { + return value + 'baz'; + }) + .withInput({ value: '' }) + .toCompileTo('<bar>baz'); + }); + + it('should escape a nested value with an unknown helper and no value set for `noEscape`', () => { + expectTemplate('{{foo nested.value}}') + .withHelper('foo', (value: string) => { + return value + 'baz'; + }) + .withInput({ nested: { value: '' } }) + .toCompileTo('<bar>baz'); + }); + + it('should escape a non-nested value with an unknown helper and false value set for `noEscape`', () => { + expectTemplate('{{foo value}}') + .withHelper('foo', (value: string) => { + return value + 'baz'; + }) + .withCompileOptions({ noEscape: false }) + .withInput({ value: '' }) + .toCompileTo('<bar>baz'); + }); + + it('should escape a nested value with an unknown helper and false value set for `noEscape`', () => { + expectTemplate('{{foo nested.value}}') + .withHelper('foo', (value: string) => { + return value + 'baz'; + }) + .withCompileOptions({ noEscape: false }) + .withInput({ nested: { value: '' } }) + .toCompileTo('<bar>baz'); + }); + + it('should not escape a non-nested value with an unknown helper and true value set for `noEscape`', () => { + expectTemplate('{{foo value}}') + .withHelper('foo', (value: string) => { + return value + 'baz'; + }) + .withCompileOptions({ noEscape: true }) + .withInput({ value: '' }) + .toCompileTo('baz'); + }); + + it('should not escape a nested value with an unknown helper and true value set for `noEscape`', () => { + expectTemplate('{{foo nested.value}}') + .withHelper('foo', (value: string) => { + return value + 'baz'; + }) + .withCompileOptions({ noEscape: true }) + .withInput({ nested: { value: '' } }) + .toCompileTo('baz'); + }); + }); + + describe('blocks', () => { + it('should escape a non-nested value with a block input and default value for `noEscape`', () => { + expectTemplate('{{#with foo}}{{#../myFunction}}{{value}}{{/../myFunction}}{{/with}}') + .withInput({ + foo: { value: '' }, + myFunction() { + return this; + }, + }) + .toCompileTo('<bar>'); + }); + + it('should escape a non-nested value with an block input and false value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{#../myFunction}}{{value}}{{/../myFunction}}{{/with}}') + .withInput({ + foo: { value: '' }, + myFunction() { + return this; + }, + }) + .withCompileOptions({ noEscape: false }) + .toCompileTo('<bar>'); + }); + + it('should not escape a non-nested value with an block input and true value set for `noEscape`', () => { + expectTemplate('{{#with foo}}{{#../myFunction}}{{value}}{{/../myFunction}}{{/with}}') + .withInput({ + foo: { value: '' }, + myFunction() { + return this; + }, + }) + .withCompileOptions({ noEscape: true }) + .toCompileTo(''); + }); + + it('should escape a nested value with an block input and default value for `noEscape`', () => { + expectTemplate( + '{{#with foo}}{{#../myFunction}}{{nested.value}}{{/../myFunction}}{{/with}}' + ) + .withInput({ + foo: { nested: { value: '' } }, + myFunction() { + return this; + }, + }) + .toCompileTo('<bar>'); + }); + + it('should escape a nested value with an block input and false value for `noEscape`', () => { + expectTemplate( + '{{#with foo}}{{#../myFunction}}{{nested.value}}{{/../myFunction}}{{/with}}' + ) + .withInput({ + foo: { nested: { value: '' } }, + myFunction() { + return this; + }, + }) + .withCompileOptions({ noEscape: false }) + .toCompileTo('<bar>'); + }); + + it('should escape a nested value with an block input and true value for `noEscape`', () => { + expectTemplate( + '{{#with foo}}{{#../myFunction}}{{nested.value}}{{/../myFunction}}{{/with}}' + ) + .withInput({ + foo: { nested: { value: '' } }, + myFunction() { + return this; + }, + }) + .withCompileOptions({ noEscape: true }) + .toCompileTo(''); + }); + }); }); }); diff --git a/packages/kbn-handlebars/src/spec/.upstream_git_hash b/packages/kbn-handlebars/src/spec/.upstream_git_hash index 0d4d453a0c5c3..3751f591ea3c3 100644 --- a/packages/kbn-handlebars/src/spec/.upstream_git_hash +++ b/packages/kbn-handlebars/src/spec/.upstream_git_hash @@ -1 +1 @@ -eab1d141cb4a1d93375d7380ed070aa1f576a2c9 \ No newline at end of file +7de4b41c344a5d702edca93d1841b59642fa32bd \ No newline at end of file diff --git a/packages/kbn-handlebars/src/visitor.ts b/packages/kbn-handlebars/src/visitor.ts index 1842c8e5d6a2b..16dc151df8640 100644 --- a/packages/kbn-handlebars/src/visitor.ts +++ b/packages/kbn-handlebars/src/visitor.ts @@ -405,6 +405,18 @@ export class ElasticHandlebarsVisitor extends Handlebars.Visitor { return this.resolvePath(data, path); } + private pushToOutputWithEscapeCheck(result: any, node: ProcessableNodeWithPathParts) { + if ( + !(node as hbs.AST.MustacheStatement).escaped || + this.compileOptions.noEscape === true || + typeof result !== 'string' + ) { + this.output.push(result); + } else { + this.output.push(Handlebars.escapeExpression(result)); + } + } + private processSimpleNode(node: ProcessableNodeWithPathParts) { const path = node.path; // @ts-expect-error strict is not a valid property on PathExpression, but we used in the same way it's also used in the original handlebars @@ -415,7 +427,7 @@ export class ElasticHandlebarsVisitor extends Handlebars.Visitor { if (isBlock(node)) { this.blockValue(node, lambdaResult); } else { - this.output.push(lambdaResult); + this.pushToOutputWithEscapeCheck(lambdaResult, node); } } @@ -435,7 +447,6 @@ export class ElasticHandlebarsVisitor extends Handlebars.Visitor { private processHelperNode(node: ProcessableNodeWithPathParts) { const path = node.path; const name = path.parts[0]; - if (this.compileOptions.knownHelpers && this.compileOptions.knownHelpers[name]) { this.invokeKnownHelper(node); } else if (this.compileOptions.knownHelpersOnly) { @@ -455,7 +466,8 @@ export class ElasticHandlebarsVisitor extends Handlebars.Visitor { const helper = this.setupHelper(node, name); // TypeScript: `helper.fn` might be `undefined` at this point, but to match the upstream behavior we call it without any guards const result = helper.fn!.call(helper.context, ...helper.params, helper.options); - this.output.push(result); + + this.pushToOutputWithEscapeCheck(result, node); } // Pops off the helper's parameters, invokes the helper, @@ -482,7 +494,7 @@ export class ElasticHandlebarsVisitor extends Handlebars.Visitor { // TypeScript: `helper.fn` might be `undefined` at this point, but to match the upstream behavior we call it without any guards const result = helper.fn!.call(helper.context, ...helper.params, helper.options); - this.output.push(result); + this.pushToOutputWithEscapeCheck(result, node); } private invokePartial(partial: hbs.AST.PartialStatement | hbs.AST.PartialBlockStatement) { diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 index bde15b20e0618..4000c050cb20b 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 @@ -138,6 +138,7 @@ RP : ')'; TRUE : T R U E; EQ : '=='; +CIEQ : '=~'; NEQ : '!='; LT : '<'; LTE : '<='; diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp index c484e0b7424a7..51248244df48b 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp @@ -52,6 +52,7 @@ null ')' null '==' +'=~' '!=' '<' '<=' @@ -159,6 +160,7 @@ RLIKE RP TRUE EQ +CIEQ NEQ LT LTE @@ -277,6 +279,7 @@ RLIKE RP TRUE EQ +CIEQ NEQ LT LTE @@ -411,4 +414,4 @@ SHOW_MODE SETTING_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 106, 1262, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 6, 20, 526, 10, 20, 13, 20, 14, 20, 527, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 536, 10, 21, 12, 21, 14, 21, 539, 11, 21, 3, 21, 5, 21, 542, 10, 21, 3, 21, 5, 21, 545, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 554, 10, 22, 12, 22, 14, 22, 557, 11, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 6, 23, 565, 10, 23, 13, 23, 14, 23, 566, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 608, 10, 34, 3, 34, 6, 34, 611, 10, 34, 13, 34, 14, 34, 612, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 5, 37, 622, 10, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 5, 39, 629, 10, 39, 3, 40, 3, 40, 3, 40, 7, 40, 634, 10, 40, 12, 40, 14, 40, 637, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 645, 10, 40, 12, 40, 14, 40, 648, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 655, 10, 40, 3, 40, 5, 40, 658, 10, 40, 5, 40, 660, 10, 40, 3, 41, 6, 41, 663, 10, 41, 13, 41, 14, 41, 664, 3, 42, 6, 42, 668, 10, 42, 13, 42, 14, 42, 669, 3, 42, 3, 42, 7, 42, 674, 10, 42, 12, 42, 14, 42, 677, 11, 42, 3, 42, 3, 42, 6, 42, 681, 10, 42, 13, 42, 14, 42, 682, 3, 42, 6, 42, 686, 10, 42, 13, 42, 14, 42, 687, 3, 42, 3, 42, 7, 42, 692, 10, 42, 12, 42, 14, 42, 695, 11, 42, 5, 42, 697, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 6, 42, 703, 10, 42, 13, 42, 14, 42, 704, 3, 42, 3, 42, 5, 42, 709, 10, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 72, 3, 72, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 7, 78, 834, 10, 78, 12, 78, 14, 78, 837, 11, 78, 3, 78, 3, 78, 5, 78, 841, 10, 78, 3, 78, 6, 78, 844, 10, 78, 13, 78, 14, 78, 845, 5, 78, 848, 10, 78, 3, 79, 3, 79, 6, 79, 852, 10, 79, 13, 79, 14, 79, 853, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 5, 89, 903, 10, 89, 3, 90, 6, 90, 906, 10, 90, 13, 90, 14, 90, 907, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 5, 98, 943, 10, 98, 3, 99, 3, 99, 5, 99, 947, 10, 99, 3, 99, 7, 99, 950, 10, 99, 12, 99, 14, 99, 953, 11, 99, 3, 99, 3, 99, 5, 99, 957, 10, 99, 3, 99, 6, 99, 960, 10, 99, 13, 99, 14, 99, 961, 5, 99, 964, 10, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 120, 3, 120, 5, 120, 1052, 10, 120, 3, 120, 7, 120, 1055, 10, 120, 12, 120, 14, 120, 1058, 11, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 6, 151, 1195, 10, 151, 13, 151, 14, 151, 1196, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 156, 3, 156, 3, 157, 3, 157, 3, 158, 3, 158, 3, 159, 3, 159, 3, 160, 3, 160, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 165, 3, 165, 3, 166, 3, 166, 3, 167, 3, 167, 3, 168, 3, 168, 3, 169, 3, 169, 3, 170, 3, 170, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 176, 3, 176, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 4, 555, 646, 2, 2, 181, 13, 2, 3, 15, 2, 4, 17, 2, 5, 19, 2, 6, 21, 2, 7, 23, 2, 8, 25, 2, 9, 27, 2, 10, 29, 2, 11, 31, 2, 12, 33, 2, 13, 35, 2, 14, 37, 2, 15, 39, 2, 16, 41, 2, 17, 43, 2, 18, 45, 2, 19, 47, 2, 20, 49, 2, 21, 51, 2, 22, 53, 2, 23, 55, 2, 24, 57, 2, 2, 59, 2, 2, 61, 2, 25, 63, 2, 26, 65, 2, 27, 67, 2, 28, 69, 2, 2, 71, 2, 2, 73, 2, 2, 75, 2, 2, 77, 2, 2, 79, 2, 2, 81, 2, 2, 83, 2, 2, 85, 2, 2, 87, 2, 2, 89, 2, 29, 91, 2, 30, 93, 2, 31, 95, 2, 32, 97, 2, 33, 99, 2, 34, 101, 2, 35, 103, 2, 36, 105, 2, 37, 107, 2, 38, 109, 2, 39, 111, 2, 40, 113, 2, 41, 115, 2, 42, 117, 2, 43, 119, 2, 44, 121, 2, 45, 123, 2, 46, 125, 2, 47, 127, 2, 48, 129, 2, 49, 131, 2, 50, 133, 2, 51, 135, 2, 52, 137, 2, 53, 139, 2, 54, 141, 2, 55, 143, 2, 56, 145, 2, 57, 147, 2, 58, 149, 2, 59, 151, 2, 60, 153, 2, 61, 155, 2, 62, 157, 2, 63, 159, 2, 64, 161, 2, 65, 163, 2, 66, 165, 2, 67, 167, 2, 68, 169, 2, 69, 171, 2, 70, 173, 2, 71, 175, 2, 2, 177, 2, 2, 179, 2, 2, 181, 2, 2, 183, 2, 2, 185, 2, 72, 187, 2, 2, 189, 2, 73, 191, 2, 2, 193, 2, 74, 195, 2, 75, 197, 2, 76, 199, 2, 2, 201, 2, 2, 203, 2, 2, 205, 2, 2, 207, 2, 77, 209, 2, 2, 211, 2, 2, 213, 2, 78, 215, 2, 79, 217, 2, 80, 219, 2, 2, 221, 2, 2, 223, 2, 2, 225, 2, 2, 227, 2, 81, 229, 2, 2, 231, 2, 2, 233, 2, 82, 235, 2, 83, 237, 2, 84, 239, 2, 2, 241, 2, 2, 243, 2, 85, 245, 2, 86, 247, 2, 2, 249, 2, 87, 251, 2, 2, 253, 2, 2, 255, 2, 88, 257, 2, 89, 259, 2, 90, 261, 2, 2, 263, 2, 2, 265, 2, 2, 267, 2, 2, 269, 2, 2, 271, 2, 2, 273, 2, 2, 275, 2, 91, 277, 2, 92, 279, 2, 93, 281, 2, 2, 283, 2, 2, 285, 2, 2, 287, 2, 2, 289, 2, 94, 291, 2, 95, 293, 2, 96, 295, 2, 2, 297, 2, 97, 299, 2, 98, 301, 2, 99, 303, 2, 100, 305, 2, 101, 307, 2, 2, 309, 2, 102, 311, 2, 103, 313, 2, 104, 315, 2, 105, 317, 2, 106, 319, 2, 2, 321, 2, 2, 323, 2, 2, 325, 2, 2, 327, 2, 2, 329, 2, 2, 331, 2, 2, 333, 2, 2, 335, 2, 2, 337, 2, 2, 339, 2, 2, 341, 2, 2, 343, 2, 2, 345, 2, 2, 347, 2, 2, 349, 2, 2, 351, 2, 2, 353, 2, 2, 355, 2, 2, 357, 2, 2, 359, 2, 2, 361, 2, 2, 363, 2, 2, 365, 2, 2, 367, 2, 2, 369, 2, 2, 13, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 40, 8, 2, 11, 12, 15, 15, 34, 34, 49, 49, 93, 93, 95, 95, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 13, 2, 11, 12, 15, 15, 34, 34, 36, 37, 46, 46, 49, 49, 60, 60, 62, 62, 64, 65, 94, 94, 126, 126, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 1263, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 3, 57, 3, 2, 2, 2, 3, 59, 3, 2, 2, 2, 3, 61, 3, 2, 2, 2, 3, 63, 3, 2, 2, 2, 3, 65, 3, 2, 2, 2, 4, 67, 3, 2, 2, 2, 4, 89, 3, 2, 2, 2, 4, 91, 3, 2, 2, 2, 4, 93, 3, 2, 2, 2, 4, 95, 3, 2, 2, 2, 4, 97, 3, 2, 2, 2, 4, 99, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 4, 105, 3, 2, 2, 2, 4, 107, 3, 2, 2, 2, 4, 109, 3, 2, 2, 2, 4, 111, 3, 2, 2, 2, 4, 113, 3, 2, 2, 2, 4, 115, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 4, 119, 3, 2, 2, 2, 4, 121, 3, 2, 2, 2, 4, 123, 3, 2, 2, 2, 4, 125, 3, 2, 2, 2, 4, 127, 3, 2, 2, 2, 4, 129, 3, 2, 2, 2, 4, 131, 3, 2, 2, 2, 4, 133, 3, 2, 2, 2, 4, 135, 3, 2, 2, 2, 4, 137, 3, 2, 2, 2, 4, 139, 3, 2, 2, 2, 4, 141, 3, 2, 2, 2, 4, 143, 3, 2, 2, 2, 4, 145, 3, 2, 2, 2, 4, 147, 3, 2, 2, 2, 4, 149, 3, 2, 2, 2, 4, 151, 3, 2, 2, 2, 4, 153, 3, 2, 2, 2, 4, 155, 3, 2, 2, 2, 4, 157, 3, 2, 2, 2, 4, 159, 3, 2, 2, 2, 4, 161, 3, 2, 2, 2, 4, 163, 3, 2, 2, 2, 4, 165, 3, 2, 2, 2, 4, 167, 3, 2, 2, 2, 4, 169, 3, 2, 2, 2, 4, 171, 3, 2, 2, 2, 4, 173, 3, 2, 2, 2, 5, 175, 3, 2, 2, 2, 5, 177, 3, 2, 2, 2, 5, 179, 3, 2, 2, 2, 5, 181, 3, 2, 2, 2, 5, 183, 3, 2, 2, 2, 5, 185, 3, 2, 2, 2, 5, 189, 3, 2, 2, 2, 5, 191, 3, 2, 2, 2, 5, 193, 3, 2, 2, 2, 5, 195, 3, 2, 2, 2, 5, 197, 3, 2, 2, 2, 6, 199, 3, 2, 2, 2, 6, 201, 3, 2, 2, 2, 6, 203, 3, 2, 2, 2, 6, 207, 3, 2, 2, 2, 6, 209, 3, 2, 2, 2, 6, 211, 3, 2, 2, 2, 6, 213, 3, 2, 2, 2, 6, 215, 3, 2, 2, 2, 6, 217, 3, 2, 2, 2, 7, 219, 3, 2, 2, 2, 7, 221, 3, 2, 2, 2, 7, 223, 3, 2, 2, 2, 7, 225, 3, 2, 2, 2, 7, 227, 3, 2, 2, 2, 7, 229, 3, 2, 2, 2, 7, 231, 3, 2, 2, 2, 7, 233, 3, 2, 2, 2, 7, 235, 3, 2, 2, 2, 7, 237, 3, 2, 2, 2, 8, 239, 3, 2, 2, 2, 8, 241, 3, 2, 2, 2, 8, 243, 3, 2, 2, 2, 8, 245, 3, 2, 2, 2, 8, 249, 3, 2, 2, 2, 8, 251, 3, 2, 2, 2, 8, 253, 3, 2, 2, 2, 8, 255, 3, 2, 2, 2, 8, 257, 3, 2, 2, 2, 8, 259, 3, 2, 2, 2, 9, 261, 3, 2, 2, 2, 9, 263, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 9, 267, 3, 2, 2, 2, 9, 269, 3, 2, 2, 2, 9, 271, 3, 2, 2, 2, 9, 273, 3, 2, 2, 2, 9, 275, 3, 2, 2, 2, 9, 277, 3, 2, 2, 2, 9, 279, 3, 2, 2, 2, 10, 281, 3, 2, 2, 2, 10, 283, 3, 2, 2, 2, 10, 285, 3, 2, 2, 2, 10, 287, 3, 2, 2, 2, 10, 289, 3, 2, 2, 2, 10, 291, 3, 2, 2, 2, 10, 293, 3, 2, 2, 2, 11, 295, 3, 2, 2, 2, 11, 297, 3, 2, 2, 2, 11, 299, 3, 2, 2, 2, 11, 301, 3, 2, 2, 2, 11, 303, 3, 2, 2, 2, 11, 305, 3, 2, 2, 2, 12, 307, 3, 2, 2, 2, 12, 309, 3, 2, 2, 2, 12, 311, 3, 2, 2, 2, 12, 313, 3, 2, 2, 2, 12, 315, 3, 2, 2, 2, 12, 317, 3, 2, 2, 2, 13, 371, 3, 2, 2, 2, 15, 381, 3, 2, 2, 2, 17, 388, 3, 2, 2, 2, 19, 397, 3, 2, 2, 2, 21, 404, 3, 2, 2, 2, 23, 414, 3, 2, 2, 2, 25, 421, 3, 2, 2, 2, 27, 428, 3, 2, 2, 2, 29, 442, 3, 2, 2, 2, 31, 449, 3, 2, 2, 2, 33, 457, 3, 2, 2, 2, 35, 469, 3, 2, 2, 2, 37, 479, 3, 2, 2, 2, 39, 488, 3, 2, 2, 2, 41, 494, 3, 2, 2, 2, 43, 501, 3, 2, 2, 2, 45, 508, 3, 2, 2, 2, 47, 516, 3, 2, 2, 2, 49, 525, 3, 2, 2, 2, 51, 531, 3, 2, 2, 2, 53, 548, 3, 2, 2, 2, 55, 564, 3, 2, 2, 2, 57, 570, 3, 2, 2, 2, 59, 575, 3, 2, 2, 2, 61, 580, 3, 2, 2, 2, 63, 584, 3, 2, 2, 2, 65, 588, 3, 2, 2, 2, 67, 592, 3, 2, 2, 2, 69, 596, 3, 2, 2, 2, 71, 598, 3, 2, 2, 2, 73, 600, 3, 2, 2, 2, 75, 603, 3, 2, 2, 2, 77, 605, 3, 2, 2, 2, 79, 614, 3, 2, 2, 2, 81, 616, 3, 2, 2, 2, 83, 621, 3, 2, 2, 2, 85, 623, 3, 2, 2, 2, 87, 628, 3, 2, 2, 2, 89, 659, 3, 2, 2, 2, 91, 662, 3, 2, 2, 2, 93, 708, 3, 2, 2, 2, 95, 710, 3, 2, 2, 2, 97, 713, 3, 2, 2, 2, 99, 717, 3, 2, 2, 2, 101, 721, 3, 2, 2, 2, 103, 723, 3, 2, 2, 2, 105, 725, 3, 2, 2, 2, 107, 730, 3, 2, 2, 2, 109, 732, 3, 2, 2, 2, 111, 738, 3, 2, 2, 2, 113, 744, 3, 2, 2, 2, 115, 749, 3, 2, 2, 2, 117, 751, 3, 2, 2, 2, 119, 754, 3, 2, 2, 2, 121, 757, 3, 2, 2, 2, 123, 762, 3, 2, 2, 2, 125, 766, 3, 2, 2, 2, 127, 771, 3, 2, 2, 2, 129, 777, 3, 2, 2, 2, 131, 780, 3, 2, 2, 2, 133, 782, 3, 2, 2, 2, 135, 788, 3, 2, 2, 2, 137, 790, 3, 2, 2, 2, 139, 795, 3, 2, 2, 2, 141, 798, 3, 2, 2, 2, 143, 801, 3, 2, 2, 2, 145, 803, 3, 2, 2, 2, 147, 806, 3, 2, 2, 2, 149, 808, 3, 2, 2, 2, 151, 811, 3, 2, 2, 2, 153, 813, 3, 2, 2, 2, 155, 815, 3, 2, 2, 2, 157, 817, 3, 2, 2, 2, 159, 819, 3, 2, 2, 2, 161, 821, 3, 2, 2, 2, 163, 826, 3, 2, 2, 2, 165, 847, 3, 2, 2, 2, 167, 849, 3, 2, 2, 2, 169, 857, 3, 2, 2, 2, 171, 861, 3, 2, 2, 2, 173, 865, 3, 2, 2, 2, 175, 869, 3, 2, 2, 2, 177, 874, 3, 2, 2, 2, 179, 878, 3, 2, 2, 2, 181, 882, 3, 2, 2, 2, 183, 886, 3, 2, 2, 2, 185, 890, 3, 2, 2, 2, 187, 902, 3, 2, 2, 2, 189, 905, 3, 2, 2, 2, 191, 909, 3, 2, 2, 2, 193, 913, 3, 2, 2, 2, 195, 917, 3, 2, 2, 2, 197, 921, 3, 2, 2, 2, 199, 925, 3, 2, 2, 2, 201, 930, 3, 2, 2, 2, 203, 934, 3, 2, 2, 2, 205, 942, 3, 2, 2, 2, 207, 963, 3, 2, 2, 2, 209, 965, 3, 2, 2, 2, 211, 969, 3, 2, 2, 2, 213, 973, 3, 2, 2, 2, 215, 977, 3, 2, 2, 2, 217, 981, 3, 2, 2, 2, 219, 985, 3, 2, 2, 2, 221, 990, 3, 2, 2, 2, 223, 994, 3, 2, 2, 2, 225, 998, 3, 2, 2, 2, 227, 1002, 3, 2, 2, 2, 229, 1005, 3, 2, 2, 2, 231, 1009, 3, 2, 2, 2, 233, 1013, 3, 2, 2, 2, 235, 1017, 3, 2, 2, 2, 237, 1021, 3, 2, 2, 2, 239, 1025, 3, 2, 2, 2, 241, 1030, 3, 2, 2, 2, 243, 1035, 3, 2, 2, 2, 245, 1040, 3, 2, 2, 2, 247, 1047, 3, 2, 2, 2, 249, 1051, 3, 2, 2, 2, 251, 1059, 3, 2, 2, 2, 253, 1063, 3, 2, 2, 2, 255, 1067, 3, 2, 2, 2, 257, 1071, 3, 2, 2, 2, 259, 1075, 3, 2, 2, 2, 261, 1079, 3, 2, 2, 2, 263, 1085, 3, 2, 2, 2, 265, 1089, 3, 2, 2, 2, 267, 1093, 3, 2, 2, 2, 269, 1097, 3, 2, 2, 2, 271, 1101, 3, 2, 2, 2, 273, 1105, 3, 2, 2, 2, 275, 1109, 3, 2, 2, 2, 277, 1113, 3, 2, 2, 2, 279, 1117, 3, 2, 2, 2, 281, 1121, 3, 2, 2, 2, 283, 1126, 3, 2, 2, 2, 285, 1130, 3, 2, 2, 2, 287, 1134, 3, 2, 2, 2, 289, 1138, 3, 2, 2, 2, 291, 1142, 3, 2, 2, 2, 293, 1146, 3, 2, 2, 2, 295, 1150, 3, 2, 2, 2, 297, 1155, 3, 2, 2, 2, 299, 1160, 3, 2, 2, 2, 301, 1170, 3, 2, 2, 2, 303, 1174, 3, 2, 2, 2, 305, 1178, 3, 2, 2, 2, 307, 1182, 3, 2, 2, 2, 309, 1187, 3, 2, 2, 2, 311, 1194, 3, 2, 2, 2, 313, 1198, 3, 2, 2, 2, 315, 1202, 3, 2, 2, 2, 317, 1206, 3, 2, 2, 2, 319, 1210, 3, 2, 2, 2, 321, 1212, 3, 2, 2, 2, 323, 1214, 3, 2, 2, 2, 325, 1216, 3, 2, 2, 2, 327, 1218, 3, 2, 2, 2, 329, 1220, 3, 2, 2, 2, 331, 1222, 3, 2, 2, 2, 333, 1224, 3, 2, 2, 2, 335, 1226, 3, 2, 2, 2, 337, 1228, 3, 2, 2, 2, 339, 1230, 3, 2, 2, 2, 341, 1232, 3, 2, 2, 2, 343, 1234, 3, 2, 2, 2, 345, 1236, 3, 2, 2, 2, 347, 1238, 3, 2, 2, 2, 349, 1240, 3, 2, 2, 2, 351, 1242, 3, 2, 2, 2, 353, 1244, 3, 2, 2, 2, 355, 1246, 3, 2, 2, 2, 357, 1248, 3, 2, 2, 2, 359, 1250, 3, 2, 2, 2, 361, 1252, 3, 2, 2, 2, 363, 1254, 3, 2, 2, 2, 365, 1256, 3, 2, 2, 2, 367, 1258, 3, 2, 2, 2, 369, 1260, 3, 2, 2, 2, 371, 372, 5, 325, 158, 2, 372, 373, 5, 335, 163, 2, 373, 374, 5, 355, 173, 2, 374, 375, 5, 355, 173, 2, 375, 376, 5, 327, 159, 2, 376, 377, 5, 323, 157, 2, 377, 378, 5, 357, 174, 2, 378, 379, 3, 2, 2, 2, 379, 380, 8, 2, 2, 2, 380, 14, 3, 2, 2, 2, 381, 382, 5, 325, 158, 2, 382, 383, 5, 353, 172, 2, 383, 384, 5, 347, 169, 2, 384, 385, 5, 349, 170, 2, 385, 386, 3, 2, 2, 2, 386, 387, 8, 3, 3, 2, 387, 16, 3, 2, 2, 2, 388, 389, 5, 327, 159, 2, 389, 390, 5, 345, 168, 2, 390, 391, 5, 353, 172, 2, 391, 392, 5, 335, 163, 2, 392, 393, 5, 323, 157, 2, 393, 394, 5, 333, 162, 2, 394, 395, 3, 2, 2, 2, 395, 396, 8, 4, 4, 2, 396, 18, 3, 2, 2, 2, 397, 398, 5, 327, 159, 2, 398, 399, 5, 361, 176, 2, 399, 400, 5, 319, 155, 2, 400, 401, 5, 341, 166, 2, 401, 402, 3, 2, 2, 2, 402, 403, 8, 5, 2, 2, 403, 20, 3, 2, 2, 2, 404, 405, 5, 327, 159, 2, 405, 406, 5, 365, 178, 2, 406, 407, 5, 349, 170, 2, 407, 408, 5, 341, 166, 2, 408, 409, 5, 319, 155, 2, 409, 410, 5, 335, 163, 2, 410, 411, 5, 345, 168, 2, 411, 412, 3, 2, 2, 2, 412, 413, 8, 6, 5, 2, 413, 22, 3, 2, 2, 2, 414, 415, 5, 329, 160, 2, 415, 416, 5, 353, 172, 2, 416, 417, 5, 347, 169, 2, 417, 418, 5, 343, 167, 2, 418, 419, 3, 2, 2, 2, 419, 420, 8, 7, 6, 2, 420, 24, 3, 2, 2, 2, 421, 422, 5, 331, 161, 2, 422, 423, 5, 353, 172, 2, 423, 424, 5, 347, 169, 2, 424, 425, 5, 339, 165, 2, 425, 426, 3, 2, 2, 2, 426, 427, 8, 8, 2, 2, 427, 26, 3, 2, 2, 2, 428, 429, 5, 335, 163, 2, 429, 430, 5, 345, 168, 2, 430, 431, 5, 341, 166, 2, 431, 432, 5, 335, 163, 2, 432, 433, 5, 345, 168, 2, 433, 434, 5, 327, 159, 2, 434, 435, 5, 355, 173, 2, 435, 436, 5, 357, 174, 2, 436, 437, 5, 319, 155, 2, 437, 438, 5, 357, 174, 2, 438, 439, 5, 355, 173, 2, 439, 440, 3, 2, 2, 2, 440, 441, 8, 9, 2, 2, 441, 28, 3, 2, 2, 2, 442, 443, 5, 339, 165, 2, 443, 444, 5, 327, 159, 2, 444, 445, 5, 327, 159, 2, 445, 446, 5, 349, 170, 2, 446, 447, 3, 2, 2, 2, 447, 448, 8, 10, 3, 2, 448, 30, 3, 2, 2, 2, 449, 450, 5, 341, 166, 2, 450, 451, 5, 335, 163, 2, 451, 452, 5, 343, 167, 2, 452, 453, 5, 335, 163, 2, 453, 454, 5, 357, 174, 2, 454, 455, 3, 2, 2, 2, 455, 456, 8, 11, 2, 2, 456, 32, 3, 2, 2, 2, 457, 458, 5, 343, 167, 2, 458, 459, 5, 361, 176, 2, 459, 460, 5, 85, 38, 2, 460, 461, 5, 327, 159, 2, 461, 462, 5, 365, 178, 2, 462, 463, 5, 349, 170, 2, 463, 464, 5, 319, 155, 2, 464, 465, 5, 345, 168, 2, 465, 466, 5, 325, 158, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 12, 7, 2, 468, 34, 3, 2, 2, 2, 469, 470, 5, 349, 170, 2, 470, 471, 5, 353, 172, 2, 471, 472, 5, 347, 169, 2, 472, 473, 5, 337, 164, 2, 473, 474, 5, 327, 159, 2, 474, 475, 5, 323, 157, 2, 475, 476, 5, 357, 174, 2, 476, 477, 3, 2, 2, 2, 477, 478, 8, 13, 3, 2, 478, 36, 3, 2, 2, 2, 479, 480, 5, 353, 172, 2, 480, 481, 5, 327, 159, 2, 481, 482, 5, 345, 168, 2, 482, 483, 5, 319, 155, 2, 483, 484, 5, 343, 167, 2, 484, 485, 5, 327, 159, 2, 485, 486, 3, 2, 2, 2, 486, 487, 8, 14, 8, 2, 487, 38, 3, 2, 2, 2, 488, 489, 5, 353, 172, 2, 489, 490, 5, 347, 169, 2, 490, 491, 5, 363, 177, 2, 491, 492, 3, 2, 2, 2, 492, 493, 8, 15, 2, 2, 493, 40, 3, 2, 2, 2, 494, 495, 5, 355, 173, 2, 495, 496, 5, 333, 162, 2, 496, 497, 5, 347, 169, 2, 497, 498, 5, 363, 177, 2, 498, 499, 3, 2, 2, 2, 499, 500, 8, 16, 9, 2, 500, 42, 3, 2, 2, 2, 501, 502, 5, 355, 173, 2, 502, 503, 5, 347, 169, 2, 503, 504, 5, 353, 172, 2, 504, 505, 5, 357, 174, 2, 505, 506, 3, 2, 2, 2, 506, 507, 8, 17, 2, 2, 507, 44, 3, 2, 2, 2, 508, 509, 5, 355, 173, 2, 509, 510, 5, 357, 174, 2, 510, 511, 5, 319, 155, 2, 511, 512, 5, 357, 174, 2, 512, 513, 5, 355, 173, 2, 513, 514, 3, 2, 2, 2, 514, 515, 8, 18, 2, 2, 515, 46, 3, 2, 2, 2, 516, 517, 5, 363, 177, 2, 517, 518, 5, 333, 162, 2, 518, 519, 5, 327, 159, 2, 519, 520, 5, 353, 172, 2, 520, 521, 5, 327, 159, 2, 521, 522, 3, 2, 2, 2, 522, 523, 8, 19, 2, 2, 523, 48, 3, 2, 2, 2, 524, 526, 10, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 8, 20, 2, 2, 530, 50, 3, 2, 2, 2, 531, 532, 7, 49, 2, 2, 532, 533, 7, 49, 2, 2, 533, 537, 3, 2, 2, 2, 534, 536, 10, 3, 2, 2, 535, 534, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 540, 542, 7, 15, 2, 2, 541, 540, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 545, 7, 12, 2, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 547, 8, 21, 10, 2, 547, 52, 3, 2, 2, 2, 548, 549, 7, 49, 2, 2, 549, 550, 7, 44, 2, 2, 550, 555, 3, 2, 2, 2, 551, 554, 5, 53, 22, 2, 552, 554, 11, 2, 2, 2, 553, 551, 3, 2, 2, 2, 553, 552, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 556, 558, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 558, 559, 7, 44, 2, 2, 559, 560, 7, 49, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 8, 22, 10, 2, 562, 54, 3, 2, 2, 2, 563, 565, 9, 4, 2, 2, 564, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 566, 567, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 8, 23, 10, 2, 569, 56, 3, 2, 2, 2, 570, 571, 5, 161, 76, 2, 571, 572, 3, 2, 2, 2, 572, 573, 8, 24, 11, 2, 573, 574, 8, 24, 12, 2, 574, 58, 3, 2, 2, 2, 575, 576, 5, 67, 29, 2, 576, 577, 3, 2, 2, 2, 577, 578, 8, 25, 13, 2, 578, 579, 8, 25, 14, 2, 579, 60, 3, 2, 2, 2, 580, 581, 5, 55, 23, 2, 581, 582, 3, 2, 2, 2, 582, 583, 8, 26, 10, 2, 583, 62, 3, 2, 2, 2, 584, 585, 5, 51, 21, 2, 585, 586, 3, 2, 2, 2, 586, 587, 8, 27, 10, 2, 587, 64, 3, 2, 2, 2, 588, 589, 5, 53, 22, 2, 589, 590, 3, 2, 2, 2, 590, 591, 8, 28, 10, 2, 591, 66, 3, 2, 2, 2, 592, 593, 7, 126, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 8, 29, 14, 2, 595, 68, 3, 2, 2, 2, 596, 597, 9, 5, 2, 2, 597, 70, 3, 2, 2, 2, 598, 599, 9, 6, 2, 2, 599, 72, 3, 2, 2, 2, 600, 601, 7, 94, 2, 2, 601, 602, 9, 7, 2, 2, 602, 74, 3, 2, 2, 2, 603, 604, 10, 8, 2, 2, 604, 76, 3, 2, 2, 2, 605, 607, 9, 9, 2, 2, 606, 608, 9, 10, 2, 2, 607, 606, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 610, 3, 2, 2, 2, 609, 611, 5, 69, 30, 2, 610, 609, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 610, 3, 2, 2, 2, 612, 613, 3, 2, 2, 2, 613, 78, 3, 2, 2, 2, 614, 615, 7, 66, 2, 2, 615, 80, 3, 2, 2, 2, 616, 617, 7, 98, 2, 2, 617, 82, 3, 2, 2, 2, 618, 622, 10, 11, 2, 2, 619, 620, 7, 98, 2, 2, 620, 622, 7, 98, 2, 2, 621, 618, 3, 2, 2, 2, 621, 619, 3, 2, 2, 2, 622, 84, 3, 2, 2, 2, 623, 624, 7, 97, 2, 2, 624, 86, 3, 2, 2, 2, 625, 629, 5, 71, 31, 2, 626, 629, 5, 69, 30, 2, 627, 629, 5, 85, 38, 2, 628, 625, 3, 2, 2, 2, 628, 626, 3, 2, 2, 2, 628, 627, 3, 2, 2, 2, 629, 88, 3, 2, 2, 2, 630, 635, 7, 36, 2, 2, 631, 634, 5, 73, 32, 2, 632, 634, 5, 75, 33, 2, 633, 631, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 637, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 638, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 638, 660, 7, 36, 2, 2, 639, 640, 7, 36, 2, 2, 640, 641, 7, 36, 2, 2, 641, 642, 7, 36, 2, 2, 642, 646, 3, 2, 2, 2, 643, 645, 10, 3, 2, 2, 644, 643, 3, 2, 2, 2, 645, 648, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 646, 644, 3, 2, 2, 2, 647, 649, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 649, 650, 7, 36, 2, 2, 650, 651, 7, 36, 2, 2, 651, 652, 7, 36, 2, 2, 652, 654, 3, 2, 2, 2, 653, 655, 7, 36, 2, 2, 654, 653, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 657, 3, 2, 2, 2, 656, 658, 7, 36, 2, 2, 657, 656, 3, 2, 2, 2, 657, 658, 3, 2, 2, 2, 658, 660, 3, 2, 2, 2, 659, 630, 3, 2, 2, 2, 659, 639, 3, 2, 2, 2, 660, 90, 3, 2, 2, 2, 661, 663, 5, 69, 30, 2, 662, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 664, 665, 3, 2, 2, 2, 665, 92, 3, 2, 2, 2, 666, 668, 5, 69, 30, 2, 667, 666, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 675, 5, 107, 49, 2, 672, 674, 5, 69, 30, 2, 673, 672, 3, 2, 2, 2, 674, 677, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 709, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 678, 680, 5, 107, 49, 2, 679, 681, 5, 69, 30, 2, 680, 679, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 709, 3, 2, 2, 2, 684, 686, 5, 69, 30, 2, 685, 684, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 685, 3, 2, 2, 2, 687, 688, 3, 2, 2, 2, 688, 696, 3, 2, 2, 2, 689, 693, 5, 107, 49, 2, 690, 692, 5, 69, 30, 2, 691, 690, 3, 2, 2, 2, 692, 695, 3, 2, 2, 2, 693, 691, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 697, 3, 2, 2, 2, 695, 693, 3, 2, 2, 2, 696, 689, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 5, 77, 34, 2, 699, 709, 3, 2, 2, 2, 700, 702, 5, 107, 49, 2, 701, 703, 5, 69, 30, 2, 702, 701, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 702, 3, 2, 2, 2, 704, 705, 3, 2, 2, 2, 705, 706, 3, 2, 2, 2, 706, 707, 5, 77, 34, 2, 707, 709, 3, 2, 2, 2, 708, 667, 3, 2, 2, 2, 708, 678, 3, 2, 2, 2, 708, 685, 3, 2, 2, 2, 708, 700, 3, 2, 2, 2, 709, 94, 3, 2, 2, 2, 710, 711, 5, 321, 156, 2, 711, 712, 5, 367, 179, 2, 712, 96, 3, 2, 2, 2, 713, 714, 5, 319, 155, 2, 714, 715, 5, 345, 168, 2, 715, 716, 5, 325, 158, 2, 716, 98, 3, 2, 2, 2, 717, 718, 5, 319, 155, 2, 718, 719, 5, 355, 173, 2, 719, 720, 5, 323, 157, 2, 720, 100, 3, 2, 2, 2, 721, 722, 7, 63, 2, 2, 722, 102, 3, 2, 2, 2, 723, 724, 7, 46, 2, 2, 724, 104, 3, 2, 2, 2, 725, 726, 5, 325, 158, 2, 726, 727, 5, 327, 159, 2, 727, 728, 5, 355, 173, 2, 728, 729, 5, 323, 157, 2, 729, 106, 3, 2, 2, 2, 730, 731, 7, 48, 2, 2, 731, 108, 3, 2, 2, 2, 732, 733, 5, 329, 160, 2, 733, 734, 5, 319, 155, 2, 734, 735, 5, 341, 166, 2, 735, 736, 5, 355, 173, 2, 736, 737, 5, 327, 159, 2, 737, 110, 3, 2, 2, 2, 738, 739, 5, 329, 160, 2, 739, 740, 5, 335, 163, 2, 740, 741, 5, 353, 172, 2, 741, 742, 5, 355, 173, 2, 742, 743, 5, 357, 174, 2, 743, 112, 3, 2, 2, 2, 744, 745, 5, 341, 166, 2, 745, 746, 5, 319, 155, 2, 746, 747, 5, 355, 173, 2, 747, 748, 5, 357, 174, 2, 748, 114, 3, 2, 2, 2, 749, 750, 7, 42, 2, 2, 750, 116, 3, 2, 2, 2, 751, 752, 5, 335, 163, 2, 752, 753, 5, 345, 168, 2, 753, 118, 3, 2, 2, 2, 754, 755, 5, 335, 163, 2, 755, 756, 5, 355, 173, 2, 756, 120, 3, 2, 2, 2, 757, 758, 5, 341, 166, 2, 758, 759, 5, 335, 163, 2, 759, 760, 5, 339, 165, 2, 760, 761, 5, 327, 159, 2, 761, 122, 3, 2, 2, 2, 762, 763, 5, 345, 168, 2, 763, 764, 5, 347, 169, 2, 764, 765, 5, 357, 174, 2, 765, 124, 3, 2, 2, 2, 766, 767, 5, 345, 168, 2, 767, 768, 5, 359, 175, 2, 768, 769, 5, 341, 166, 2, 769, 770, 5, 341, 166, 2, 770, 126, 3, 2, 2, 2, 771, 772, 5, 345, 168, 2, 772, 773, 5, 359, 175, 2, 773, 774, 5, 341, 166, 2, 774, 775, 5, 341, 166, 2, 775, 776, 5, 355, 173, 2, 776, 128, 3, 2, 2, 2, 777, 778, 5, 347, 169, 2, 778, 779, 5, 353, 172, 2, 779, 130, 3, 2, 2, 2, 780, 781, 7, 65, 2, 2, 781, 132, 3, 2, 2, 2, 782, 783, 5, 353, 172, 2, 783, 784, 5, 341, 166, 2, 784, 785, 5, 335, 163, 2, 785, 786, 5, 339, 165, 2, 786, 787, 5, 327, 159, 2, 787, 134, 3, 2, 2, 2, 788, 789, 7, 43, 2, 2, 789, 136, 3, 2, 2, 2, 790, 791, 5, 357, 174, 2, 791, 792, 5, 353, 172, 2, 792, 793, 5, 359, 175, 2, 793, 794, 5, 327, 159, 2, 794, 138, 3, 2, 2, 2, 795, 796, 7, 63, 2, 2, 796, 797, 7, 63, 2, 2, 797, 140, 3, 2, 2, 2, 798, 799, 7, 35, 2, 2, 799, 800, 7, 63, 2, 2, 800, 142, 3, 2, 2, 2, 801, 802, 7, 62, 2, 2, 802, 144, 3, 2, 2, 2, 803, 804, 7, 62, 2, 2, 804, 805, 7, 63, 2, 2, 805, 146, 3, 2, 2, 2, 806, 807, 7, 64, 2, 2, 807, 148, 3, 2, 2, 2, 808, 809, 7, 64, 2, 2, 809, 810, 7, 63, 2, 2, 810, 150, 3, 2, 2, 2, 811, 812, 7, 45, 2, 2, 812, 152, 3, 2, 2, 2, 813, 814, 7, 47, 2, 2, 814, 154, 3, 2, 2, 2, 815, 816, 7, 44, 2, 2, 816, 156, 3, 2, 2, 2, 817, 818, 7, 49, 2, 2, 818, 158, 3, 2, 2, 2, 819, 820, 7, 39, 2, 2, 820, 160, 3, 2, 2, 2, 821, 822, 7, 93, 2, 2, 822, 823, 3, 2, 2, 2, 823, 824, 8, 76, 2, 2, 824, 825, 8, 76, 2, 2, 825, 162, 3, 2, 2, 2, 826, 827, 7, 95, 2, 2, 827, 828, 3, 2, 2, 2, 828, 829, 8, 77, 14, 2, 829, 830, 8, 77, 14, 2, 830, 164, 3, 2, 2, 2, 831, 835, 5, 71, 31, 2, 832, 834, 5, 87, 39, 2, 833, 832, 3, 2, 2, 2, 834, 837, 3, 2, 2, 2, 835, 833, 3, 2, 2, 2, 835, 836, 3, 2, 2, 2, 836, 848, 3, 2, 2, 2, 837, 835, 3, 2, 2, 2, 838, 841, 5, 85, 38, 2, 839, 841, 5, 79, 35, 2, 840, 838, 3, 2, 2, 2, 840, 839, 3, 2, 2, 2, 841, 843, 3, 2, 2, 2, 842, 844, 5, 87, 39, 2, 843, 842, 3, 2, 2, 2, 844, 845, 3, 2, 2, 2, 845, 843, 3, 2, 2, 2, 845, 846, 3, 2, 2, 2, 846, 848, 3, 2, 2, 2, 847, 831, 3, 2, 2, 2, 847, 840, 3, 2, 2, 2, 848, 166, 3, 2, 2, 2, 849, 851, 5, 81, 36, 2, 850, 852, 5, 83, 37, 2, 851, 850, 3, 2, 2, 2, 852, 853, 3, 2, 2, 2, 853, 851, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 856, 5, 81, 36, 2, 856, 168, 3, 2, 2, 2, 857, 858, 5, 51, 21, 2, 858, 859, 3, 2, 2, 2, 859, 860, 8, 80, 10, 2, 860, 170, 3, 2, 2, 2, 861, 862, 5, 53, 22, 2, 862, 863, 3, 2, 2, 2, 863, 864, 8, 81, 10, 2, 864, 172, 3, 2, 2, 2, 865, 866, 5, 55, 23, 2, 866, 867, 3, 2, 2, 2, 867, 868, 8, 82, 10, 2, 868, 174, 3, 2, 2, 2, 869, 870, 5, 67, 29, 2, 870, 871, 3, 2, 2, 2, 871, 872, 8, 83, 13, 2, 872, 873, 8, 83, 14, 2, 873, 176, 3, 2, 2, 2, 874, 875, 5, 161, 76, 2, 875, 876, 3, 2, 2, 2, 876, 877, 8, 84, 11, 2, 877, 178, 3, 2, 2, 2, 878, 879, 5, 163, 77, 2, 879, 880, 3, 2, 2, 2, 880, 881, 8, 85, 15, 2, 881, 180, 3, 2, 2, 2, 882, 883, 5, 103, 47, 2, 883, 884, 3, 2, 2, 2, 884, 885, 8, 86, 16, 2, 885, 182, 3, 2, 2, 2, 886, 887, 5, 101, 46, 2, 887, 888, 3, 2, 2, 2, 888, 889, 8, 87, 17, 2, 889, 184, 3, 2, 2, 2, 890, 891, 5, 343, 167, 2, 891, 892, 5, 327, 159, 2, 892, 893, 5, 357, 174, 2, 893, 894, 5, 319, 155, 2, 894, 895, 5, 325, 158, 2, 895, 896, 5, 319, 155, 2, 896, 897, 5, 357, 174, 2, 897, 898, 5, 319, 155, 2, 898, 186, 3, 2, 2, 2, 899, 903, 10, 12, 2, 2, 900, 901, 7, 49, 2, 2, 901, 903, 10, 13, 2, 2, 902, 899, 3, 2, 2, 2, 902, 900, 3, 2, 2, 2, 903, 188, 3, 2, 2, 2, 904, 906, 5, 187, 89, 2, 905, 904, 3, 2, 2, 2, 906, 907, 3, 2, 2, 2, 907, 905, 3, 2, 2, 2, 907, 908, 3, 2, 2, 2, 908, 190, 3, 2, 2, 2, 909, 910, 5, 167, 79, 2, 910, 911, 3, 2, 2, 2, 911, 912, 8, 91, 18, 2, 912, 192, 3, 2, 2, 2, 913, 914, 5, 51, 21, 2, 914, 915, 3, 2, 2, 2, 915, 916, 8, 92, 10, 2, 916, 194, 3, 2, 2, 2, 917, 918, 5, 53, 22, 2, 918, 919, 3, 2, 2, 2, 919, 920, 8, 93, 10, 2, 920, 196, 3, 2, 2, 2, 921, 922, 5, 55, 23, 2, 922, 923, 3, 2, 2, 2, 923, 924, 8, 94, 10, 2, 924, 198, 3, 2, 2, 2, 925, 926, 5, 67, 29, 2, 926, 927, 3, 2, 2, 2, 927, 928, 8, 95, 13, 2, 928, 929, 8, 95, 14, 2, 929, 200, 3, 2, 2, 2, 930, 931, 5, 107, 49, 2, 931, 932, 3, 2, 2, 2, 932, 933, 8, 96, 19, 2, 933, 202, 3, 2, 2, 2, 934, 935, 5, 103, 47, 2, 935, 936, 3, 2, 2, 2, 936, 937, 8, 97, 16, 2, 937, 204, 3, 2, 2, 2, 938, 943, 5, 71, 31, 2, 939, 943, 5, 69, 30, 2, 940, 943, 5, 85, 38, 2, 941, 943, 5, 155, 73, 2, 942, 938, 3, 2, 2, 2, 942, 939, 3, 2, 2, 2, 942, 940, 3, 2, 2, 2, 942, 941, 3, 2, 2, 2, 943, 206, 3, 2, 2, 2, 944, 947, 5, 71, 31, 2, 945, 947, 5, 155, 73, 2, 946, 944, 3, 2, 2, 2, 946, 945, 3, 2, 2, 2, 947, 951, 3, 2, 2, 2, 948, 950, 5, 205, 98, 2, 949, 948, 3, 2, 2, 2, 950, 953, 3, 2, 2, 2, 951, 949, 3, 2, 2, 2, 951, 952, 3, 2, 2, 2, 952, 964, 3, 2, 2, 2, 953, 951, 3, 2, 2, 2, 954, 957, 5, 85, 38, 2, 955, 957, 5, 79, 35, 2, 956, 954, 3, 2, 2, 2, 956, 955, 3, 2, 2, 2, 957, 959, 3, 2, 2, 2, 958, 960, 5, 205, 98, 2, 959, 958, 3, 2, 2, 2, 960, 961, 3, 2, 2, 2, 961, 959, 3, 2, 2, 2, 961, 962, 3, 2, 2, 2, 962, 964, 3, 2, 2, 2, 963, 946, 3, 2, 2, 2, 963, 956, 3, 2, 2, 2, 964, 208, 3, 2, 2, 2, 965, 966, 5, 207, 99, 2, 966, 967, 3, 2, 2, 2, 967, 968, 8, 100, 20, 2, 968, 210, 3, 2, 2, 2, 969, 970, 5, 167, 79, 2, 970, 971, 3, 2, 2, 2, 971, 972, 8, 101, 18, 2, 972, 212, 3, 2, 2, 2, 973, 974, 5, 51, 21, 2, 974, 975, 3, 2, 2, 2, 975, 976, 8, 102, 10, 2, 976, 214, 3, 2, 2, 2, 977, 978, 5, 53, 22, 2, 978, 979, 3, 2, 2, 2, 979, 980, 8, 103, 10, 2, 980, 216, 3, 2, 2, 2, 981, 982, 5, 55, 23, 2, 982, 983, 3, 2, 2, 2, 983, 984, 8, 104, 10, 2, 984, 218, 3, 2, 2, 2, 985, 986, 5, 67, 29, 2, 986, 987, 3, 2, 2, 2, 987, 988, 8, 105, 13, 2, 988, 989, 8, 105, 14, 2, 989, 220, 3, 2, 2, 2, 990, 991, 5, 101, 46, 2, 991, 992, 3, 2, 2, 2, 992, 993, 8, 106, 17, 2, 993, 222, 3, 2, 2, 2, 994, 995, 5, 103, 47, 2, 995, 996, 3, 2, 2, 2, 996, 997, 8, 107, 16, 2, 997, 224, 3, 2, 2, 2, 998, 999, 5, 107, 49, 2, 999, 1000, 3, 2, 2, 2, 1000, 1001, 8, 108, 19, 2, 1001, 226, 3, 2, 2, 2, 1002, 1003, 5, 319, 155, 2, 1003, 1004, 5, 355, 173, 2, 1004, 228, 3, 2, 2, 2, 1005, 1006, 5, 167, 79, 2, 1006, 1007, 3, 2, 2, 2, 1007, 1008, 8, 110, 18, 2, 1008, 230, 3, 2, 2, 2, 1009, 1010, 5, 207, 99, 2, 1010, 1011, 3, 2, 2, 2, 1011, 1012, 8, 111, 20, 2, 1012, 232, 3, 2, 2, 2, 1013, 1014, 5, 51, 21, 2, 1014, 1015, 3, 2, 2, 2, 1015, 1016, 8, 112, 10, 2, 1016, 234, 3, 2, 2, 2, 1017, 1018, 5, 53, 22, 2, 1018, 1019, 3, 2, 2, 2, 1019, 1020, 8, 113, 10, 2, 1020, 236, 3, 2, 2, 2, 1021, 1022, 5, 55, 23, 2, 1022, 1023, 3, 2, 2, 2, 1023, 1024, 8, 114, 10, 2, 1024, 238, 3, 2, 2, 2, 1025, 1026, 5, 67, 29, 2, 1026, 1027, 3, 2, 2, 2, 1027, 1028, 8, 115, 13, 2, 1028, 1029, 8, 115, 14, 2, 1029, 240, 3, 2, 2, 2, 1030, 1031, 5, 161, 76, 2, 1031, 1032, 3, 2, 2, 2, 1032, 1033, 8, 116, 11, 2, 1033, 1034, 8, 116, 21, 2, 1034, 242, 3, 2, 2, 2, 1035, 1036, 5, 347, 169, 2, 1036, 1037, 5, 345, 168, 2, 1037, 1038, 3, 2, 2, 2, 1038, 1039, 8, 117, 22, 2, 1039, 244, 3, 2, 2, 2, 1040, 1041, 5, 363, 177, 2, 1041, 1042, 5, 335, 163, 2, 1042, 1043, 5, 357, 174, 2, 1043, 1044, 5, 333, 162, 2, 1044, 1045, 3, 2, 2, 2, 1045, 1046, 8, 118, 22, 2, 1046, 246, 3, 2, 2, 2, 1047, 1048, 10, 14, 2, 2, 1048, 248, 3, 2, 2, 2, 1049, 1052, 5, 71, 31, 2, 1050, 1052, 5, 69, 30, 2, 1051, 1049, 3, 2, 2, 2, 1051, 1050, 3, 2, 2, 2, 1052, 1056, 3, 2, 2, 2, 1053, 1055, 5, 247, 119, 2, 1054, 1053, 3, 2, 2, 2, 1055, 1058, 3, 2, 2, 2, 1056, 1054, 3, 2, 2, 2, 1056, 1057, 3, 2, 2, 2, 1057, 250, 3, 2, 2, 2, 1058, 1056, 3, 2, 2, 2, 1059, 1060, 5, 167, 79, 2, 1060, 1061, 3, 2, 2, 2, 1061, 1062, 8, 121, 18, 2, 1062, 252, 3, 2, 2, 2, 1063, 1064, 5, 249, 120, 2, 1064, 1065, 3, 2, 2, 2, 1065, 1066, 8, 122, 23, 2, 1066, 254, 3, 2, 2, 2, 1067, 1068, 5, 51, 21, 2, 1068, 1069, 3, 2, 2, 2, 1069, 1070, 8, 123, 10, 2, 1070, 256, 3, 2, 2, 2, 1071, 1072, 5, 53, 22, 2, 1072, 1073, 3, 2, 2, 2, 1073, 1074, 8, 124, 10, 2, 1074, 258, 3, 2, 2, 2, 1075, 1076, 5, 55, 23, 2, 1076, 1077, 3, 2, 2, 2, 1077, 1078, 8, 125, 10, 2, 1078, 260, 3, 2, 2, 2, 1079, 1080, 5, 67, 29, 2, 1080, 1081, 3, 2, 2, 2, 1081, 1082, 8, 126, 13, 2, 1082, 1083, 8, 126, 14, 2, 1083, 1084, 8, 126, 14, 2, 1084, 262, 3, 2, 2, 2, 1085, 1086, 5, 101, 46, 2, 1086, 1087, 3, 2, 2, 2, 1087, 1088, 8, 127, 17, 2, 1088, 264, 3, 2, 2, 2, 1089, 1090, 5, 103, 47, 2, 1090, 1091, 3, 2, 2, 2, 1091, 1092, 8, 128, 16, 2, 1092, 266, 3, 2, 2, 2, 1093, 1094, 5, 107, 49, 2, 1094, 1095, 3, 2, 2, 2, 1095, 1096, 8, 129, 19, 2, 1096, 268, 3, 2, 2, 2, 1097, 1098, 5, 245, 118, 2, 1098, 1099, 3, 2, 2, 2, 1099, 1100, 8, 130, 24, 2, 1100, 270, 3, 2, 2, 2, 1101, 1102, 5, 207, 99, 2, 1102, 1103, 3, 2, 2, 2, 1103, 1104, 8, 131, 20, 2, 1104, 272, 3, 2, 2, 2, 1105, 1106, 5, 167, 79, 2, 1106, 1107, 3, 2, 2, 2, 1107, 1108, 8, 132, 18, 2, 1108, 274, 3, 2, 2, 2, 1109, 1110, 5, 51, 21, 2, 1110, 1111, 3, 2, 2, 2, 1111, 1112, 8, 133, 10, 2, 1112, 276, 3, 2, 2, 2, 1113, 1114, 5, 53, 22, 2, 1114, 1115, 3, 2, 2, 2, 1115, 1116, 8, 134, 10, 2, 1116, 278, 3, 2, 2, 2, 1117, 1118, 5, 55, 23, 2, 1118, 1119, 3, 2, 2, 2, 1119, 1120, 8, 135, 10, 2, 1120, 280, 3, 2, 2, 2, 1121, 1122, 5, 67, 29, 2, 1122, 1123, 3, 2, 2, 2, 1123, 1124, 8, 136, 13, 2, 1124, 1125, 8, 136, 14, 2, 1125, 282, 3, 2, 2, 2, 1126, 1127, 5, 107, 49, 2, 1127, 1128, 3, 2, 2, 2, 1128, 1129, 8, 137, 19, 2, 1129, 284, 3, 2, 2, 2, 1130, 1131, 5, 167, 79, 2, 1131, 1132, 3, 2, 2, 2, 1132, 1133, 8, 138, 18, 2, 1133, 286, 3, 2, 2, 2, 1134, 1135, 5, 165, 78, 2, 1135, 1136, 3, 2, 2, 2, 1136, 1137, 8, 139, 25, 2, 1137, 288, 3, 2, 2, 2, 1138, 1139, 5, 51, 21, 2, 1139, 1140, 3, 2, 2, 2, 1140, 1141, 8, 140, 10, 2, 1141, 290, 3, 2, 2, 2, 1142, 1143, 5, 53, 22, 2, 1143, 1144, 3, 2, 2, 2, 1144, 1145, 8, 141, 10, 2, 1145, 292, 3, 2, 2, 2, 1146, 1147, 5, 55, 23, 2, 1147, 1148, 3, 2, 2, 2, 1148, 1149, 8, 142, 10, 2, 1149, 294, 3, 2, 2, 2, 1150, 1151, 5, 67, 29, 2, 1151, 1152, 3, 2, 2, 2, 1152, 1153, 8, 143, 13, 2, 1153, 1154, 8, 143, 14, 2, 1154, 296, 3, 2, 2, 2, 1155, 1156, 5, 335, 163, 2, 1156, 1157, 5, 345, 168, 2, 1157, 1158, 5, 329, 160, 2, 1158, 1159, 5, 347, 169, 2, 1159, 298, 3, 2, 2, 2, 1160, 1161, 5, 329, 160, 2, 1161, 1162, 5, 359, 175, 2, 1162, 1163, 5, 345, 168, 2, 1163, 1164, 5, 323, 157, 2, 1164, 1165, 5, 357, 174, 2, 1165, 1166, 5, 335, 163, 2, 1166, 1167, 5, 347, 169, 2, 1167, 1168, 5, 345, 168, 2, 1168, 1169, 5, 355, 173, 2, 1169, 300, 3, 2, 2, 2, 1170, 1171, 5, 51, 21, 2, 1171, 1172, 3, 2, 2, 2, 1172, 1173, 8, 146, 10, 2, 1173, 302, 3, 2, 2, 2, 1174, 1175, 5, 53, 22, 2, 1175, 1176, 3, 2, 2, 2, 1176, 1177, 8, 147, 10, 2, 1177, 304, 3, 2, 2, 2, 1178, 1179, 5, 55, 23, 2, 1179, 1180, 3, 2, 2, 2, 1180, 1181, 8, 148, 10, 2, 1181, 306, 3, 2, 2, 2, 1182, 1183, 5, 163, 77, 2, 1183, 1184, 3, 2, 2, 2, 1184, 1185, 8, 149, 15, 2, 1185, 1186, 8, 149, 14, 2, 1186, 308, 3, 2, 2, 2, 1187, 1188, 7, 60, 2, 2, 1188, 310, 3, 2, 2, 2, 1189, 1195, 5, 79, 35, 2, 1190, 1195, 5, 69, 30, 2, 1191, 1195, 5, 107, 49, 2, 1192, 1195, 5, 71, 31, 2, 1193, 1195, 5, 85, 38, 2, 1194, 1189, 3, 2, 2, 2, 1194, 1190, 3, 2, 2, 2, 1194, 1191, 3, 2, 2, 2, 1194, 1192, 3, 2, 2, 2, 1194, 1193, 3, 2, 2, 2, 1195, 1196, 3, 2, 2, 2, 1196, 1194, 3, 2, 2, 2, 1196, 1197, 3, 2, 2, 2, 1197, 312, 3, 2, 2, 2, 1198, 1199, 5, 51, 21, 2, 1199, 1200, 3, 2, 2, 2, 1200, 1201, 8, 152, 10, 2, 1201, 314, 3, 2, 2, 2, 1202, 1203, 5, 53, 22, 2, 1203, 1204, 3, 2, 2, 2, 1204, 1205, 8, 153, 10, 2, 1205, 316, 3, 2, 2, 2, 1206, 1207, 5, 55, 23, 2, 1207, 1208, 3, 2, 2, 2, 1208, 1209, 8, 154, 10, 2, 1209, 318, 3, 2, 2, 2, 1210, 1211, 9, 15, 2, 2, 1211, 320, 3, 2, 2, 2, 1212, 1213, 9, 16, 2, 2, 1213, 322, 3, 2, 2, 2, 1214, 1215, 9, 17, 2, 2, 1215, 324, 3, 2, 2, 2, 1216, 1217, 9, 18, 2, 2, 1217, 326, 3, 2, 2, 2, 1218, 1219, 9, 9, 2, 2, 1219, 328, 3, 2, 2, 2, 1220, 1221, 9, 19, 2, 2, 1221, 330, 3, 2, 2, 2, 1222, 1223, 9, 20, 2, 2, 1223, 332, 3, 2, 2, 2, 1224, 1225, 9, 21, 2, 2, 1225, 334, 3, 2, 2, 2, 1226, 1227, 9, 22, 2, 2, 1227, 336, 3, 2, 2, 2, 1228, 1229, 9, 23, 2, 2, 1229, 338, 3, 2, 2, 2, 1230, 1231, 9, 24, 2, 2, 1231, 340, 3, 2, 2, 2, 1232, 1233, 9, 25, 2, 2, 1233, 342, 3, 2, 2, 2, 1234, 1235, 9, 26, 2, 2, 1235, 344, 3, 2, 2, 2, 1236, 1237, 9, 27, 2, 2, 1237, 346, 3, 2, 2, 2, 1238, 1239, 9, 28, 2, 2, 1239, 348, 3, 2, 2, 2, 1240, 1241, 9, 29, 2, 2, 1241, 350, 3, 2, 2, 2, 1242, 1243, 9, 30, 2, 2, 1243, 352, 3, 2, 2, 2, 1244, 1245, 9, 31, 2, 2, 1245, 354, 3, 2, 2, 2, 1246, 1247, 9, 32, 2, 2, 1247, 356, 3, 2, 2, 2, 1248, 1249, 9, 33, 2, 2, 1249, 358, 3, 2, 2, 2, 1250, 1251, 9, 34, 2, 2, 1251, 360, 3, 2, 2, 2, 1252, 1253, 9, 35, 2, 2, 1253, 362, 3, 2, 2, 2, 1254, 1255, 9, 36, 2, 2, 1255, 364, 3, 2, 2, 2, 1256, 1257, 9, 37, 2, 2, 1257, 366, 3, 2, 2, 2, 1258, 1259, 9, 38, 2, 2, 1259, 368, 3, 2, 2, 2, 1260, 1261, 9, 39, 2, 2, 1261, 370, 3, 2, 2, 2, 56, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 527, 537, 541, 544, 553, 555, 566, 607, 612, 621, 628, 633, 635, 646, 654, 657, 659, 664, 669, 675, 682, 687, 693, 696, 704, 708, 835, 840, 845, 847, 853, 902, 907, 942, 946, 951, 956, 961, 963, 1051, 1056, 1194, 1196, 26, 7, 4, 2, 7, 6, 2, 7, 8, 2, 7, 3, 2, 7, 5, 2, 7, 10, 2, 7, 7, 2, 7, 11, 2, 2, 3, 2, 9, 65, 2, 7, 2, 2, 9, 28, 2, 6, 2, 2, 9, 66, 2, 9, 36, 2, 9, 35, 2, 9, 68, 2, 9, 38, 2, 9, 77, 2, 7, 12, 2, 7, 9, 2, 9, 87, 2, 9, 86, 2, 9, 67, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 107, 1267, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 6, 20, 528, 10, 20, 13, 20, 14, 20, 529, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 538, 10, 21, 12, 21, 14, 21, 541, 11, 21, 3, 21, 5, 21, 544, 10, 21, 3, 21, 5, 21, 547, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 556, 10, 22, 12, 22, 14, 22, 559, 11, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 6, 23, 567, 10, 23, 13, 23, 14, 23, 568, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 610, 10, 34, 3, 34, 6, 34, 613, 10, 34, 13, 34, 14, 34, 614, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 5, 37, 624, 10, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 5, 39, 631, 10, 39, 3, 40, 3, 40, 3, 40, 7, 40, 636, 10, 40, 12, 40, 14, 40, 639, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 647, 10, 40, 12, 40, 14, 40, 650, 11, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 657, 10, 40, 3, 40, 5, 40, 660, 10, 40, 5, 40, 662, 10, 40, 3, 41, 6, 41, 665, 10, 41, 13, 41, 14, 41, 666, 3, 42, 6, 42, 670, 10, 42, 13, 42, 14, 42, 671, 3, 42, 3, 42, 7, 42, 676, 10, 42, 12, 42, 14, 42, 679, 11, 42, 3, 42, 3, 42, 6, 42, 683, 10, 42, 13, 42, 14, 42, 684, 3, 42, 6, 42, 688, 10, 42, 13, 42, 14, 42, 689, 3, 42, 3, 42, 7, 42, 694, 10, 42, 12, 42, 14, 42, 697, 11, 42, 5, 42, 699, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 6, 42, 705, 10, 42, 13, 42, 14, 42, 706, 3, 42, 3, 42, 5, 42, 711, 10, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 7, 79, 839, 10, 79, 12, 79, 14, 79, 842, 11, 79, 3, 79, 3, 79, 5, 79, 846, 10, 79, 3, 79, 6, 79, 849, 10, 79, 13, 79, 14, 79, 850, 5, 79, 853, 10, 79, 3, 80, 3, 80, 6, 80, 857, 10, 80, 13, 80, 14, 80, 858, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 5, 90, 908, 10, 90, 3, 91, 6, 91, 911, 10, 91, 13, 91, 14, 91, 912, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 5, 99, 948, 10, 99, 3, 100, 3, 100, 5, 100, 952, 10, 100, 3, 100, 7, 100, 955, 10, 100, 12, 100, 14, 100, 958, 11, 100, 3, 100, 3, 100, 5, 100, 962, 10, 100, 3, 100, 6, 100, 965, 10, 100, 13, 100, 14, 100, 966, 5, 100, 969, 10, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 121, 3, 121, 5, 121, 1057, 10, 121, 3, 121, 7, 121, 1060, 10, 121, 12, 121, 14, 121, 1063, 11, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 6, 152, 1200, 10, 152, 13, 152, 14, 152, 1201, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 157, 3, 157, 3, 158, 3, 158, 3, 159, 3, 159, 3, 160, 3, 160, 3, 161, 3, 161, 3, 162, 3, 162, 3, 163, 3, 163, 3, 164, 3, 164, 3, 165, 3, 165, 3, 166, 3, 166, 3, 167, 3, 167, 3, 168, 3, 168, 3, 169, 3, 169, 3, 170, 3, 170, 3, 171, 3, 171, 3, 172, 3, 172, 3, 173, 3, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 176, 3, 176, 3, 177, 3, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 180, 3, 180, 3, 181, 3, 181, 4, 557, 648, 2, 2, 182, 13, 2, 3, 15, 2, 4, 17, 2, 5, 19, 2, 6, 21, 2, 7, 23, 2, 8, 25, 2, 9, 27, 2, 10, 29, 2, 11, 31, 2, 12, 33, 2, 13, 35, 2, 14, 37, 2, 15, 39, 2, 16, 41, 2, 17, 43, 2, 18, 45, 2, 19, 47, 2, 20, 49, 2, 21, 51, 2, 22, 53, 2, 23, 55, 2, 24, 57, 2, 2, 59, 2, 2, 61, 2, 25, 63, 2, 26, 65, 2, 27, 67, 2, 28, 69, 2, 2, 71, 2, 2, 73, 2, 2, 75, 2, 2, 77, 2, 2, 79, 2, 2, 81, 2, 2, 83, 2, 2, 85, 2, 2, 87, 2, 2, 89, 2, 29, 91, 2, 30, 93, 2, 31, 95, 2, 32, 97, 2, 33, 99, 2, 34, 101, 2, 35, 103, 2, 36, 105, 2, 37, 107, 2, 38, 109, 2, 39, 111, 2, 40, 113, 2, 41, 115, 2, 42, 117, 2, 43, 119, 2, 44, 121, 2, 45, 123, 2, 46, 125, 2, 47, 127, 2, 48, 129, 2, 49, 131, 2, 50, 133, 2, 51, 135, 2, 52, 137, 2, 53, 139, 2, 54, 141, 2, 55, 143, 2, 56, 145, 2, 57, 147, 2, 58, 149, 2, 59, 151, 2, 60, 153, 2, 61, 155, 2, 62, 157, 2, 63, 159, 2, 64, 161, 2, 65, 163, 2, 66, 165, 2, 67, 167, 2, 68, 169, 2, 69, 171, 2, 70, 173, 2, 71, 175, 2, 72, 177, 2, 2, 179, 2, 2, 181, 2, 2, 183, 2, 2, 185, 2, 2, 187, 2, 73, 189, 2, 2, 191, 2, 74, 193, 2, 2, 195, 2, 75, 197, 2, 76, 199, 2, 77, 201, 2, 2, 203, 2, 2, 205, 2, 2, 207, 2, 2, 209, 2, 78, 211, 2, 2, 213, 2, 2, 215, 2, 79, 217, 2, 80, 219, 2, 81, 221, 2, 2, 223, 2, 2, 225, 2, 2, 227, 2, 2, 229, 2, 82, 231, 2, 2, 233, 2, 2, 235, 2, 83, 237, 2, 84, 239, 2, 85, 241, 2, 2, 243, 2, 2, 245, 2, 86, 247, 2, 87, 249, 2, 2, 251, 2, 88, 253, 2, 2, 255, 2, 2, 257, 2, 89, 259, 2, 90, 261, 2, 91, 263, 2, 2, 265, 2, 2, 267, 2, 2, 269, 2, 2, 271, 2, 2, 273, 2, 2, 275, 2, 2, 277, 2, 92, 279, 2, 93, 281, 2, 94, 283, 2, 2, 285, 2, 2, 287, 2, 2, 289, 2, 2, 291, 2, 95, 293, 2, 96, 295, 2, 97, 297, 2, 2, 299, 2, 98, 301, 2, 99, 303, 2, 100, 305, 2, 101, 307, 2, 102, 309, 2, 2, 311, 2, 103, 313, 2, 104, 315, 2, 105, 317, 2, 106, 319, 2, 107, 321, 2, 2, 323, 2, 2, 325, 2, 2, 327, 2, 2, 329, 2, 2, 331, 2, 2, 333, 2, 2, 335, 2, 2, 337, 2, 2, 339, 2, 2, 341, 2, 2, 343, 2, 2, 345, 2, 2, 347, 2, 2, 349, 2, 2, 351, 2, 2, 353, 2, 2, 355, 2, 2, 357, 2, 2, 359, 2, 2, 361, 2, 2, 363, 2, 2, 365, 2, 2, 367, 2, 2, 369, 2, 2, 371, 2, 2, 13, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 40, 8, 2, 11, 12, 15, 15, 34, 34, 49, 49, 93, 93, 95, 95, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 15, 15, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 7, 2, 36, 36, 94, 94, 112, 112, 116, 116, 118, 118, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 3, 2, 98, 98, 12, 2, 11, 12, 15, 15, 34, 34, 46, 46, 49, 49, 63, 63, 93, 93, 95, 95, 98, 98, 126, 126, 4, 2, 44, 44, 49, 49, 13, 2, 11, 12, 15, 15, 34, 34, 36, 37, 46, 46, 49, 49, 60, 60, 62, 62, 64, 65, 94, 94, 126, 126, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 1268, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 3, 57, 3, 2, 2, 2, 3, 59, 3, 2, 2, 2, 3, 61, 3, 2, 2, 2, 3, 63, 3, 2, 2, 2, 3, 65, 3, 2, 2, 2, 4, 67, 3, 2, 2, 2, 4, 89, 3, 2, 2, 2, 4, 91, 3, 2, 2, 2, 4, 93, 3, 2, 2, 2, 4, 95, 3, 2, 2, 2, 4, 97, 3, 2, 2, 2, 4, 99, 3, 2, 2, 2, 4, 101, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 4, 105, 3, 2, 2, 2, 4, 107, 3, 2, 2, 2, 4, 109, 3, 2, 2, 2, 4, 111, 3, 2, 2, 2, 4, 113, 3, 2, 2, 2, 4, 115, 3, 2, 2, 2, 4, 117, 3, 2, 2, 2, 4, 119, 3, 2, 2, 2, 4, 121, 3, 2, 2, 2, 4, 123, 3, 2, 2, 2, 4, 125, 3, 2, 2, 2, 4, 127, 3, 2, 2, 2, 4, 129, 3, 2, 2, 2, 4, 131, 3, 2, 2, 2, 4, 133, 3, 2, 2, 2, 4, 135, 3, 2, 2, 2, 4, 137, 3, 2, 2, 2, 4, 139, 3, 2, 2, 2, 4, 141, 3, 2, 2, 2, 4, 143, 3, 2, 2, 2, 4, 145, 3, 2, 2, 2, 4, 147, 3, 2, 2, 2, 4, 149, 3, 2, 2, 2, 4, 151, 3, 2, 2, 2, 4, 153, 3, 2, 2, 2, 4, 155, 3, 2, 2, 2, 4, 157, 3, 2, 2, 2, 4, 159, 3, 2, 2, 2, 4, 161, 3, 2, 2, 2, 4, 163, 3, 2, 2, 2, 4, 165, 3, 2, 2, 2, 4, 167, 3, 2, 2, 2, 4, 169, 3, 2, 2, 2, 4, 171, 3, 2, 2, 2, 4, 173, 3, 2, 2, 2, 4, 175, 3, 2, 2, 2, 5, 177, 3, 2, 2, 2, 5, 179, 3, 2, 2, 2, 5, 181, 3, 2, 2, 2, 5, 183, 3, 2, 2, 2, 5, 185, 3, 2, 2, 2, 5, 187, 3, 2, 2, 2, 5, 191, 3, 2, 2, 2, 5, 193, 3, 2, 2, 2, 5, 195, 3, 2, 2, 2, 5, 197, 3, 2, 2, 2, 5, 199, 3, 2, 2, 2, 6, 201, 3, 2, 2, 2, 6, 203, 3, 2, 2, 2, 6, 205, 3, 2, 2, 2, 6, 209, 3, 2, 2, 2, 6, 211, 3, 2, 2, 2, 6, 213, 3, 2, 2, 2, 6, 215, 3, 2, 2, 2, 6, 217, 3, 2, 2, 2, 6, 219, 3, 2, 2, 2, 7, 221, 3, 2, 2, 2, 7, 223, 3, 2, 2, 2, 7, 225, 3, 2, 2, 2, 7, 227, 3, 2, 2, 2, 7, 229, 3, 2, 2, 2, 7, 231, 3, 2, 2, 2, 7, 233, 3, 2, 2, 2, 7, 235, 3, 2, 2, 2, 7, 237, 3, 2, 2, 2, 7, 239, 3, 2, 2, 2, 8, 241, 3, 2, 2, 2, 8, 243, 3, 2, 2, 2, 8, 245, 3, 2, 2, 2, 8, 247, 3, 2, 2, 2, 8, 251, 3, 2, 2, 2, 8, 253, 3, 2, 2, 2, 8, 255, 3, 2, 2, 2, 8, 257, 3, 2, 2, 2, 8, 259, 3, 2, 2, 2, 8, 261, 3, 2, 2, 2, 9, 263, 3, 2, 2, 2, 9, 265, 3, 2, 2, 2, 9, 267, 3, 2, 2, 2, 9, 269, 3, 2, 2, 2, 9, 271, 3, 2, 2, 2, 9, 273, 3, 2, 2, 2, 9, 275, 3, 2, 2, 2, 9, 277, 3, 2, 2, 2, 9, 279, 3, 2, 2, 2, 9, 281, 3, 2, 2, 2, 10, 283, 3, 2, 2, 2, 10, 285, 3, 2, 2, 2, 10, 287, 3, 2, 2, 2, 10, 289, 3, 2, 2, 2, 10, 291, 3, 2, 2, 2, 10, 293, 3, 2, 2, 2, 10, 295, 3, 2, 2, 2, 11, 297, 3, 2, 2, 2, 11, 299, 3, 2, 2, 2, 11, 301, 3, 2, 2, 2, 11, 303, 3, 2, 2, 2, 11, 305, 3, 2, 2, 2, 11, 307, 3, 2, 2, 2, 12, 309, 3, 2, 2, 2, 12, 311, 3, 2, 2, 2, 12, 313, 3, 2, 2, 2, 12, 315, 3, 2, 2, 2, 12, 317, 3, 2, 2, 2, 12, 319, 3, 2, 2, 2, 13, 373, 3, 2, 2, 2, 15, 383, 3, 2, 2, 2, 17, 390, 3, 2, 2, 2, 19, 399, 3, 2, 2, 2, 21, 406, 3, 2, 2, 2, 23, 416, 3, 2, 2, 2, 25, 423, 3, 2, 2, 2, 27, 430, 3, 2, 2, 2, 29, 444, 3, 2, 2, 2, 31, 451, 3, 2, 2, 2, 33, 459, 3, 2, 2, 2, 35, 471, 3, 2, 2, 2, 37, 481, 3, 2, 2, 2, 39, 490, 3, 2, 2, 2, 41, 496, 3, 2, 2, 2, 43, 503, 3, 2, 2, 2, 45, 510, 3, 2, 2, 2, 47, 518, 3, 2, 2, 2, 49, 527, 3, 2, 2, 2, 51, 533, 3, 2, 2, 2, 53, 550, 3, 2, 2, 2, 55, 566, 3, 2, 2, 2, 57, 572, 3, 2, 2, 2, 59, 577, 3, 2, 2, 2, 61, 582, 3, 2, 2, 2, 63, 586, 3, 2, 2, 2, 65, 590, 3, 2, 2, 2, 67, 594, 3, 2, 2, 2, 69, 598, 3, 2, 2, 2, 71, 600, 3, 2, 2, 2, 73, 602, 3, 2, 2, 2, 75, 605, 3, 2, 2, 2, 77, 607, 3, 2, 2, 2, 79, 616, 3, 2, 2, 2, 81, 618, 3, 2, 2, 2, 83, 623, 3, 2, 2, 2, 85, 625, 3, 2, 2, 2, 87, 630, 3, 2, 2, 2, 89, 661, 3, 2, 2, 2, 91, 664, 3, 2, 2, 2, 93, 710, 3, 2, 2, 2, 95, 712, 3, 2, 2, 2, 97, 715, 3, 2, 2, 2, 99, 719, 3, 2, 2, 2, 101, 723, 3, 2, 2, 2, 103, 725, 3, 2, 2, 2, 105, 727, 3, 2, 2, 2, 107, 732, 3, 2, 2, 2, 109, 734, 3, 2, 2, 2, 111, 740, 3, 2, 2, 2, 113, 746, 3, 2, 2, 2, 115, 751, 3, 2, 2, 2, 117, 753, 3, 2, 2, 2, 119, 756, 3, 2, 2, 2, 121, 759, 3, 2, 2, 2, 123, 764, 3, 2, 2, 2, 125, 768, 3, 2, 2, 2, 127, 773, 3, 2, 2, 2, 129, 779, 3, 2, 2, 2, 131, 782, 3, 2, 2, 2, 133, 784, 3, 2, 2, 2, 135, 790, 3, 2, 2, 2, 137, 792, 3, 2, 2, 2, 139, 797, 3, 2, 2, 2, 141, 800, 3, 2, 2, 2, 143, 803, 3, 2, 2, 2, 145, 806, 3, 2, 2, 2, 147, 808, 3, 2, 2, 2, 149, 811, 3, 2, 2, 2, 151, 813, 3, 2, 2, 2, 153, 816, 3, 2, 2, 2, 155, 818, 3, 2, 2, 2, 157, 820, 3, 2, 2, 2, 159, 822, 3, 2, 2, 2, 161, 824, 3, 2, 2, 2, 163, 826, 3, 2, 2, 2, 165, 831, 3, 2, 2, 2, 167, 852, 3, 2, 2, 2, 169, 854, 3, 2, 2, 2, 171, 862, 3, 2, 2, 2, 173, 866, 3, 2, 2, 2, 175, 870, 3, 2, 2, 2, 177, 874, 3, 2, 2, 2, 179, 879, 3, 2, 2, 2, 181, 883, 3, 2, 2, 2, 183, 887, 3, 2, 2, 2, 185, 891, 3, 2, 2, 2, 187, 895, 3, 2, 2, 2, 189, 907, 3, 2, 2, 2, 191, 910, 3, 2, 2, 2, 193, 914, 3, 2, 2, 2, 195, 918, 3, 2, 2, 2, 197, 922, 3, 2, 2, 2, 199, 926, 3, 2, 2, 2, 201, 930, 3, 2, 2, 2, 203, 935, 3, 2, 2, 2, 205, 939, 3, 2, 2, 2, 207, 947, 3, 2, 2, 2, 209, 968, 3, 2, 2, 2, 211, 970, 3, 2, 2, 2, 213, 974, 3, 2, 2, 2, 215, 978, 3, 2, 2, 2, 217, 982, 3, 2, 2, 2, 219, 986, 3, 2, 2, 2, 221, 990, 3, 2, 2, 2, 223, 995, 3, 2, 2, 2, 225, 999, 3, 2, 2, 2, 227, 1003, 3, 2, 2, 2, 229, 1007, 3, 2, 2, 2, 231, 1010, 3, 2, 2, 2, 233, 1014, 3, 2, 2, 2, 235, 1018, 3, 2, 2, 2, 237, 1022, 3, 2, 2, 2, 239, 1026, 3, 2, 2, 2, 241, 1030, 3, 2, 2, 2, 243, 1035, 3, 2, 2, 2, 245, 1040, 3, 2, 2, 2, 247, 1045, 3, 2, 2, 2, 249, 1052, 3, 2, 2, 2, 251, 1056, 3, 2, 2, 2, 253, 1064, 3, 2, 2, 2, 255, 1068, 3, 2, 2, 2, 257, 1072, 3, 2, 2, 2, 259, 1076, 3, 2, 2, 2, 261, 1080, 3, 2, 2, 2, 263, 1084, 3, 2, 2, 2, 265, 1090, 3, 2, 2, 2, 267, 1094, 3, 2, 2, 2, 269, 1098, 3, 2, 2, 2, 271, 1102, 3, 2, 2, 2, 273, 1106, 3, 2, 2, 2, 275, 1110, 3, 2, 2, 2, 277, 1114, 3, 2, 2, 2, 279, 1118, 3, 2, 2, 2, 281, 1122, 3, 2, 2, 2, 283, 1126, 3, 2, 2, 2, 285, 1131, 3, 2, 2, 2, 287, 1135, 3, 2, 2, 2, 289, 1139, 3, 2, 2, 2, 291, 1143, 3, 2, 2, 2, 293, 1147, 3, 2, 2, 2, 295, 1151, 3, 2, 2, 2, 297, 1155, 3, 2, 2, 2, 299, 1160, 3, 2, 2, 2, 301, 1165, 3, 2, 2, 2, 303, 1175, 3, 2, 2, 2, 305, 1179, 3, 2, 2, 2, 307, 1183, 3, 2, 2, 2, 309, 1187, 3, 2, 2, 2, 311, 1192, 3, 2, 2, 2, 313, 1199, 3, 2, 2, 2, 315, 1203, 3, 2, 2, 2, 317, 1207, 3, 2, 2, 2, 319, 1211, 3, 2, 2, 2, 321, 1215, 3, 2, 2, 2, 323, 1217, 3, 2, 2, 2, 325, 1219, 3, 2, 2, 2, 327, 1221, 3, 2, 2, 2, 329, 1223, 3, 2, 2, 2, 331, 1225, 3, 2, 2, 2, 333, 1227, 3, 2, 2, 2, 335, 1229, 3, 2, 2, 2, 337, 1231, 3, 2, 2, 2, 339, 1233, 3, 2, 2, 2, 341, 1235, 3, 2, 2, 2, 343, 1237, 3, 2, 2, 2, 345, 1239, 3, 2, 2, 2, 347, 1241, 3, 2, 2, 2, 349, 1243, 3, 2, 2, 2, 351, 1245, 3, 2, 2, 2, 353, 1247, 3, 2, 2, 2, 355, 1249, 3, 2, 2, 2, 357, 1251, 3, 2, 2, 2, 359, 1253, 3, 2, 2, 2, 361, 1255, 3, 2, 2, 2, 363, 1257, 3, 2, 2, 2, 365, 1259, 3, 2, 2, 2, 367, 1261, 3, 2, 2, 2, 369, 1263, 3, 2, 2, 2, 371, 1265, 3, 2, 2, 2, 373, 374, 5, 327, 159, 2, 374, 375, 5, 337, 164, 2, 375, 376, 5, 357, 174, 2, 376, 377, 5, 357, 174, 2, 377, 378, 5, 329, 160, 2, 378, 379, 5, 325, 158, 2, 379, 380, 5, 359, 175, 2, 380, 381, 3, 2, 2, 2, 381, 382, 8, 2, 2, 2, 382, 14, 3, 2, 2, 2, 383, 384, 5, 327, 159, 2, 384, 385, 5, 355, 173, 2, 385, 386, 5, 349, 170, 2, 386, 387, 5, 351, 171, 2, 387, 388, 3, 2, 2, 2, 388, 389, 8, 3, 3, 2, 389, 16, 3, 2, 2, 2, 390, 391, 5, 329, 160, 2, 391, 392, 5, 347, 169, 2, 392, 393, 5, 355, 173, 2, 393, 394, 5, 337, 164, 2, 394, 395, 5, 325, 158, 2, 395, 396, 5, 335, 163, 2, 396, 397, 3, 2, 2, 2, 397, 398, 8, 4, 4, 2, 398, 18, 3, 2, 2, 2, 399, 400, 5, 329, 160, 2, 400, 401, 5, 363, 177, 2, 401, 402, 5, 321, 156, 2, 402, 403, 5, 343, 167, 2, 403, 404, 3, 2, 2, 2, 404, 405, 8, 5, 2, 2, 405, 20, 3, 2, 2, 2, 406, 407, 5, 329, 160, 2, 407, 408, 5, 367, 179, 2, 408, 409, 5, 351, 171, 2, 409, 410, 5, 343, 167, 2, 410, 411, 5, 321, 156, 2, 411, 412, 5, 337, 164, 2, 412, 413, 5, 347, 169, 2, 413, 414, 3, 2, 2, 2, 414, 415, 8, 6, 5, 2, 415, 22, 3, 2, 2, 2, 416, 417, 5, 331, 161, 2, 417, 418, 5, 355, 173, 2, 418, 419, 5, 349, 170, 2, 419, 420, 5, 345, 168, 2, 420, 421, 3, 2, 2, 2, 421, 422, 8, 7, 6, 2, 422, 24, 3, 2, 2, 2, 423, 424, 5, 333, 162, 2, 424, 425, 5, 355, 173, 2, 425, 426, 5, 349, 170, 2, 426, 427, 5, 341, 166, 2, 427, 428, 3, 2, 2, 2, 428, 429, 8, 8, 2, 2, 429, 26, 3, 2, 2, 2, 430, 431, 5, 337, 164, 2, 431, 432, 5, 347, 169, 2, 432, 433, 5, 343, 167, 2, 433, 434, 5, 337, 164, 2, 434, 435, 5, 347, 169, 2, 435, 436, 5, 329, 160, 2, 436, 437, 5, 357, 174, 2, 437, 438, 5, 359, 175, 2, 438, 439, 5, 321, 156, 2, 439, 440, 5, 359, 175, 2, 440, 441, 5, 357, 174, 2, 441, 442, 3, 2, 2, 2, 442, 443, 8, 9, 2, 2, 443, 28, 3, 2, 2, 2, 444, 445, 5, 341, 166, 2, 445, 446, 5, 329, 160, 2, 446, 447, 5, 329, 160, 2, 447, 448, 5, 351, 171, 2, 448, 449, 3, 2, 2, 2, 449, 450, 8, 10, 3, 2, 450, 30, 3, 2, 2, 2, 451, 452, 5, 343, 167, 2, 452, 453, 5, 337, 164, 2, 453, 454, 5, 345, 168, 2, 454, 455, 5, 337, 164, 2, 455, 456, 5, 359, 175, 2, 456, 457, 3, 2, 2, 2, 457, 458, 8, 11, 2, 2, 458, 32, 3, 2, 2, 2, 459, 460, 5, 345, 168, 2, 460, 461, 5, 363, 177, 2, 461, 462, 5, 85, 38, 2, 462, 463, 5, 329, 160, 2, 463, 464, 5, 367, 179, 2, 464, 465, 5, 351, 171, 2, 465, 466, 5, 321, 156, 2, 466, 467, 5, 347, 169, 2, 467, 468, 5, 327, 159, 2, 468, 469, 3, 2, 2, 2, 469, 470, 8, 12, 7, 2, 470, 34, 3, 2, 2, 2, 471, 472, 5, 351, 171, 2, 472, 473, 5, 355, 173, 2, 473, 474, 5, 349, 170, 2, 474, 475, 5, 339, 165, 2, 475, 476, 5, 329, 160, 2, 476, 477, 5, 325, 158, 2, 477, 478, 5, 359, 175, 2, 478, 479, 3, 2, 2, 2, 479, 480, 8, 13, 3, 2, 480, 36, 3, 2, 2, 2, 481, 482, 5, 355, 173, 2, 482, 483, 5, 329, 160, 2, 483, 484, 5, 347, 169, 2, 484, 485, 5, 321, 156, 2, 485, 486, 5, 345, 168, 2, 486, 487, 5, 329, 160, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 14, 8, 2, 489, 38, 3, 2, 2, 2, 490, 491, 5, 355, 173, 2, 491, 492, 5, 349, 170, 2, 492, 493, 5, 365, 178, 2, 493, 494, 3, 2, 2, 2, 494, 495, 8, 15, 2, 2, 495, 40, 3, 2, 2, 2, 496, 497, 5, 357, 174, 2, 497, 498, 5, 335, 163, 2, 498, 499, 5, 349, 170, 2, 499, 500, 5, 365, 178, 2, 500, 501, 3, 2, 2, 2, 501, 502, 8, 16, 9, 2, 502, 42, 3, 2, 2, 2, 503, 504, 5, 357, 174, 2, 504, 505, 5, 349, 170, 2, 505, 506, 5, 355, 173, 2, 506, 507, 5, 359, 175, 2, 507, 508, 3, 2, 2, 2, 508, 509, 8, 17, 2, 2, 509, 44, 3, 2, 2, 2, 510, 511, 5, 357, 174, 2, 511, 512, 5, 359, 175, 2, 512, 513, 5, 321, 156, 2, 513, 514, 5, 359, 175, 2, 514, 515, 5, 357, 174, 2, 515, 516, 3, 2, 2, 2, 516, 517, 8, 18, 2, 2, 517, 46, 3, 2, 2, 2, 518, 519, 5, 365, 178, 2, 519, 520, 5, 335, 163, 2, 520, 521, 5, 329, 160, 2, 521, 522, 5, 355, 173, 2, 522, 523, 5, 329, 160, 2, 523, 524, 3, 2, 2, 2, 524, 525, 8, 19, 2, 2, 525, 48, 3, 2, 2, 2, 526, 528, 10, 2, 2, 2, 527, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 3, 2, 2, 2, 531, 532, 8, 20, 2, 2, 532, 50, 3, 2, 2, 2, 533, 534, 7, 49, 2, 2, 534, 535, 7, 49, 2, 2, 535, 539, 3, 2, 2, 2, 536, 538, 10, 3, 2, 2, 537, 536, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 544, 7, 15, 2, 2, 543, 542, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 547, 7, 12, 2, 2, 546, 545, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 548, 3, 2, 2, 2, 548, 549, 8, 21, 10, 2, 549, 52, 3, 2, 2, 2, 550, 551, 7, 49, 2, 2, 551, 552, 7, 44, 2, 2, 552, 557, 3, 2, 2, 2, 553, 556, 5, 53, 22, 2, 554, 556, 11, 2, 2, 2, 555, 553, 3, 2, 2, 2, 555, 554, 3, 2, 2, 2, 556, 559, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 558, 560, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 560, 561, 7, 44, 2, 2, 561, 562, 7, 49, 2, 2, 562, 563, 3, 2, 2, 2, 563, 564, 8, 22, 10, 2, 564, 54, 3, 2, 2, 2, 565, 567, 9, 4, 2, 2, 566, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 566, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 8, 23, 10, 2, 571, 56, 3, 2, 2, 2, 572, 573, 5, 163, 77, 2, 573, 574, 3, 2, 2, 2, 574, 575, 8, 24, 11, 2, 575, 576, 8, 24, 12, 2, 576, 58, 3, 2, 2, 2, 577, 578, 5, 67, 29, 2, 578, 579, 3, 2, 2, 2, 579, 580, 8, 25, 13, 2, 580, 581, 8, 25, 14, 2, 581, 60, 3, 2, 2, 2, 582, 583, 5, 55, 23, 2, 583, 584, 3, 2, 2, 2, 584, 585, 8, 26, 10, 2, 585, 62, 3, 2, 2, 2, 586, 587, 5, 51, 21, 2, 587, 588, 3, 2, 2, 2, 588, 589, 8, 27, 10, 2, 589, 64, 3, 2, 2, 2, 590, 591, 5, 53, 22, 2, 591, 592, 3, 2, 2, 2, 592, 593, 8, 28, 10, 2, 593, 66, 3, 2, 2, 2, 594, 595, 7, 126, 2, 2, 595, 596, 3, 2, 2, 2, 596, 597, 8, 29, 14, 2, 597, 68, 3, 2, 2, 2, 598, 599, 9, 5, 2, 2, 599, 70, 3, 2, 2, 2, 600, 601, 9, 6, 2, 2, 601, 72, 3, 2, 2, 2, 602, 603, 7, 94, 2, 2, 603, 604, 9, 7, 2, 2, 604, 74, 3, 2, 2, 2, 605, 606, 10, 8, 2, 2, 606, 76, 3, 2, 2, 2, 607, 609, 9, 9, 2, 2, 608, 610, 9, 10, 2, 2, 609, 608, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 3, 2, 2, 2, 611, 613, 5, 69, 30, 2, 612, 611, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 612, 3, 2, 2, 2, 614, 615, 3, 2, 2, 2, 615, 78, 3, 2, 2, 2, 616, 617, 7, 66, 2, 2, 617, 80, 3, 2, 2, 2, 618, 619, 7, 98, 2, 2, 619, 82, 3, 2, 2, 2, 620, 624, 10, 11, 2, 2, 621, 622, 7, 98, 2, 2, 622, 624, 7, 98, 2, 2, 623, 620, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 624, 84, 3, 2, 2, 2, 625, 626, 7, 97, 2, 2, 626, 86, 3, 2, 2, 2, 627, 631, 5, 71, 31, 2, 628, 631, 5, 69, 30, 2, 629, 631, 5, 85, 38, 2, 630, 627, 3, 2, 2, 2, 630, 628, 3, 2, 2, 2, 630, 629, 3, 2, 2, 2, 631, 88, 3, 2, 2, 2, 632, 637, 7, 36, 2, 2, 633, 636, 5, 73, 32, 2, 634, 636, 5, 75, 33, 2, 635, 633, 3, 2, 2, 2, 635, 634, 3, 2, 2, 2, 636, 639, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 637, 638, 3, 2, 2, 2, 638, 640, 3, 2, 2, 2, 639, 637, 3, 2, 2, 2, 640, 662, 7, 36, 2, 2, 641, 642, 7, 36, 2, 2, 642, 643, 7, 36, 2, 2, 643, 644, 7, 36, 2, 2, 644, 648, 3, 2, 2, 2, 645, 647, 10, 3, 2, 2, 646, 645, 3, 2, 2, 2, 647, 650, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 649, 651, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 651, 652, 7, 36, 2, 2, 652, 653, 7, 36, 2, 2, 653, 654, 7, 36, 2, 2, 654, 656, 3, 2, 2, 2, 655, 657, 7, 36, 2, 2, 656, 655, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 659, 3, 2, 2, 2, 658, 660, 7, 36, 2, 2, 659, 658, 3, 2, 2, 2, 659, 660, 3, 2, 2, 2, 660, 662, 3, 2, 2, 2, 661, 632, 3, 2, 2, 2, 661, 641, 3, 2, 2, 2, 662, 90, 3, 2, 2, 2, 663, 665, 5, 69, 30, 2, 664, 663, 3, 2, 2, 2, 665, 666, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 92, 3, 2, 2, 2, 668, 670, 5, 69, 30, 2, 669, 668, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 673, 3, 2, 2, 2, 673, 677, 5, 107, 49, 2, 674, 676, 5, 69, 30, 2, 675, 674, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 711, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 682, 5, 107, 49, 2, 681, 683, 5, 69, 30, 2, 682, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 682, 3, 2, 2, 2, 684, 685, 3, 2, 2, 2, 685, 711, 3, 2, 2, 2, 686, 688, 5, 69, 30, 2, 687, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 687, 3, 2, 2, 2, 689, 690, 3, 2, 2, 2, 690, 698, 3, 2, 2, 2, 691, 695, 5, 107, 49, 2, 692, 694, 5, 69, 30, 2, 693, 692, 3, 2, 2, 2, 694, 697, 3, 2, 2, 2, 695, 693, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 699, 3, 2, 2, 2, 697, 695, 3, 2, 2, 2, 698, 691, 3, 2, 2, 2, 698, 699, 3, 2, 2, 2, 699, 700, 3, 2, 2, 2, 700, 701, 5, 77, 34, 2, 701, 711, 3, 2, 2, 2, 702, 704, 5, 107, 49, 2, 703, 705, 5, 69, 30, 2, 704, 703, 3, 2, 2, 2, 705, 706, 3, 2, 2, 2, 706, 704, 3, 2, 2, 2, 706, 707, 3, 2, 2, 2, 707, 708, 3, 2, 2, 2, 708, 709, 5, 77, 34, 2, 709, 711, 3, 2, 2, 2, 710, 669, 3, 2, 2, 2, 710, 680, 3, 2, 2, 2, 710, 687, 3, 2, 2, 2, 710, 702, 3, 2, 2, 2, 711, 94, 3, 2, 2, 2, 712, 713, 5, 323, 157, 2, 713, 714, 5, 369, 180, 2, 714, 96, 3, 2, 2, 2, 715, 716, 5, 321, 156, 2, 716, 717, 5, 347, 169, 2, 717, 718, 5, 327, 159, 2, 718, 98, 3, 2, 2, 2, 719, 720, 5, 321, 156, 2, 720, 721, 5, 357, 174, 2, 721, 722, 5, 325, 158, 2, 722, 100, 3, 2, 2, 2, 723, 724, 7, 63, 2, 2, 724, 102, 3, 2, 2, 2, 725, 726, 7, 46, 2, 2, 726, 104, 3, 2, 2, 2, 727, 728, 5, 327, 159, 2, 728, 729, 5, 329, 160, 2, 729, 730, 5, 357, 174, 2, 730, 731, 5, 325, 158, 2, 731, 106, 3, 2, 2, 2, 732, 733, 7, 48, 2, 2, 733, 108, 3, 2, 2, 2, 734, 735, 5, 331, 161, 2, 735, 736, 5, 321, 156, 2, 736, 737, 5, 343, 167, 2, 737, 738, 5, 357, 174, 2, 738, 739, 5, 329, 160, 2, 739, 110, 3, 2, 2, 2, 740, 741, 5, 331, 161, 2, 741, 742, 5, 337, 164, 2, 742, 743, 5, 355, 173, 2, 743, 744, 5, 357, 174, 2, 744, 745, 5, 359, 175, 2, 745, 112, 3, 2, 2, 2, 746, 747, 5, 343, 167, 2, 747, 748, 5, 321, 156, 2, 748, 749, 5, 357, 174, 2, 749, 750, 5, 359, 175, 2, 750, 114, 3, 2, 2, 2, 751, 752, 7, 42, 2, 2, 752, 116, 3, 2, 2, 2, 753, 754, 5, 337, 164, 2, 754, 755, 5, 347, 169, 2, 755, 118, 3, 2, 2, 2, 756, 757, 5, 337, 164, 2, 757, 758, 5, 357, 174, 2, 758, 120, 3, 2, 2, 2, 759, 760, 5, 343, 167, 2, 760, 761, 5, 337, 164, 2, 761, 762, 5, 341, 166, 2, 762, 763, 5, 329, 160, 2, 763, 122, 3, 2, 2, 2, 764, 765, 5, 347, 169, 2, 765, 766, 5, 349, 170, 2, 766, 767, 5, 359, 175, 2, 767, 124, 3, 2, 2, 2, 768, 769, 5, 347, 169, 2, 769, 770, 5, 361, 176, 2, 770, 771, 5, 343, 167, 2, 771, 772, 5, 343, 167, 2, 772, 126, 3, 2, 2, 2, 773, 774, 5, 347, 169, 2, 774, 775, 5, 361, 176, 2, 775, 776, 5, 343, 167, 2, 776, 777, 5, 343, 167, 2, 777, 778, 5, 357, 174, 2, 778, 128, 3, 2, 2, 2, 779, 780, 5, 349, 170, 2, 780, 781, 5, 355, 173, 2, 781, 130, 3, 2, 2, 2, 782, 783, 7, 65, 2, 2, 783, 132, 3, 2, 2, 2, 784, 785, 5, 355, 173, 2, 785, 786, 5, 343, 167, 2, 786, 787, 5, 337, 164, 2, 787, 788, 5, 341, 166, 2, 788, 789, 5, 329, 160, 2, 789, 134, 3, 2, 2, 2, 790, 791, 7, 43, 2, 2, 791, 136, 3, 2, 2, 2, 792, 793, 5, 359, 175, 2, 793, 794, 5, 355, 173, 2, 794, 795, 5, 361, 176, 2, 795, 796, 5, 329, 160, 2, 796, 138, 3, 2, 2, 2, 797, 798, 7, 63, 2, 2, 798, 799, 7, 63, 2, 2, 799, 140, 3, 2, 2, 2, 800, 801, 7, 63, 2, 2, 801, 802, 7, 128, 2, 2, 802, 142, 3, 2, 2, 2, 803, 804, 7, 35, 2, 2, 804, 805, 7, 63, 2, 2, 805, 144, 3, 2, 2, 2, 806, 807, 7, 62, 2, 2, 807, 146, 3, 2, 2, 2, 808, 809, 7, 62, 2, 2, 809, 810, 7, 63, 2, 2, 810, 148, 3, 2, 2, 2, 811, 812, 7, 64, 2, 2, 812, 150, 3, 2, 2, 2, 813, 814, 7, 64, 2, 2, 814, 815, 7, 63, 2, 2, 815, 152, 3, 2, 2, 2, 816, 817, 7, 45, 2, 2, 817, 154, 3, 2, 2, 2, 818, 819, 7, 47, 2, 2, 819, 156, 3, 2, 2, 2, 820, 821, 7, 44, 2, 2, 821, 158, 3, 2, 2, 2, 822, 823, 7, 49, 2, 2, 823, 160, 3, 2, 2, 2, 824, 825, 7, 39, 2, 2, 825, 162, 3, 2, 2, 2, 826, 827, 7, 93, 2, 2, 827, 828, 3, 2, 2, 2, 828, 829, 8, 77, 2, 2, 829, 830, 8, 77, 2, 2, 830, 164, 3, 2, 2, 2, 831, 832, 7, 95, 2, 2, 832, 833, 3, 2, 2, 2, 833, 834, 8, 78, 14, 2, 834, 835, 8, 78, 14, 2, 835, 166, 3, 2, 2, 2, 836, 840, 5, 71, 31, 2, 837, 839, 5, 87, 39, 2, 838, 837, 3, 2, 2, 2, 839, 842, 3, 2, 2, 2, 840, 838, 3, 2, 2, 2, 840, 841, 3, 2, 2, 2, 841, 853, 3, 2, 2, 2, 842, 840, 3, 2, 2, 2, 843, 846, 5, 85, 38, 2, 844, 846, 5, 79, 35, 2, 845, 843, 3, 2, 2, 2, 845, 844, 3, 2, 2, 2, 846, 848, 3, 2, 2, 2, 847, 849, 5, 87, 39, 2, 848, 847, 3, 2, 2, 2, 849, 850, 3, 2, 2, 2, 850, 848, 3, 2, 2, 2, 850, 851, 3, 2, 2, 2, 851, 853, 3, 2, 2, 2, 852, 836, 3, 2, 2, 2, 852, 845, 3, 2, 2, 2, 853, 168, 3, 2, 2, 2, 854, 856, 5, 81, 36, 2, 855, 857, 5, 83, 37, 2, 856, 855, 3, 2, 2, 2, 857, 858, 3, 2, 2, 2, 858, 856, 3, 2, 2, 2, 858, 859, 3, 2, 2, 2, 859, 860, 3, 2, 2, 2, 860, 861, 5, 81, 36, 2, 861, 170, 3, 2, 2, 2, 862, 863, 5, 51, 21, 2, 863, 864, 3, 2, 2, 2, 864, 865, 8, 81, 10, 2, 865, 172, 3, 2, 2, 2, 866, 867, 5, 53, 22, 2, 867, 868, 3, 2, 2, 2, 868, 869, 8, 82, 10, 2, 869, 174, 3, 2, 2, 2, 870, 871, 5, 55, 23, 2, 871, 872, 3, 2, 2, 2, 872, 873, 8, 83, 10, 2, 873, 176, 3, 2, 2, 2, 874, 875, 5, 67, 29, 2, 875, 876, 3, 2, 2, 2, 876, 877, 8, 84, 13, 2, 877, 878, 8, 84, 14, 2, 878, 178, 3, 2, 2, 2, 879, 880, 5, 163, 77, 2, 880, 881, 3, 2, 2, 2, 881, 882, 8, 85, 11, 2, 882, 180, 3, 2, 2, 2, 883, 884, 5, 165, 78, 2, 884, 885, 3, 2, 2, 2, 885, 886, 8, 86, 15, 2, 886, 182, 3, 2, 2, 2, 887, 888, 5, 103, 47, 2, 888, 889, 3, 2, 2, 2, 889, 890, 8, 87, 16, 2, 890, 184, 3, 2, 2, 2, 891, 892, 5, 101, 46, 2, 892, 893, 3, 2, 2, 2, 893, 894, 8, 88, 17, 2, 894, 186, 3, 2, 2, 2, 895, 896, 5, 345, 168, 2, 896, 897, 5, 329, 160, 2, 897, 898, 5, 359, 175, 2, 898, 899, 5, 321, 156, 2, 899, 900, 5, 327, 159, 2, 900, 901, 5, 321, 156, 2, 901, 902, 5, 359, 175, 2, 902, 903, 5, 321, 156, 2, 903, 188, 3, 2, 2, 2, 904, 908, 10, 12, 2, 2, 905, 906, 7, 49, 2, 2, 906, 908, 10, 13, 2, 2, 907, 904, 3, 2, 2, 2, 907, 905, 3, 2, 2, 2, 908, 190, 3, 2, 2, 2, 909, 911, 5, 189, 90, 2, 910, 909, 3, 2, 2, 2, 911, 912, 3, 2, 2, 2, 912, 910, 3, 2, 2, 2, 912, 913, 3, 2, 2, 2, 913, 192, 3, 2, 2, 2, 914, 915, 5, 169, 80, 2, 915, 916, 3, 2, 2, 2, 916, 917, 8, 92, 18, 2, 917, 194, 3, 2, 2, 2, 918, 919, 5, 51, 21, 2, 919, 920, 3, 2, 2, 2, 920, 921, 8, 93, 10, 2, 921, 196, 3, 2, 2, 2, 922, 923, 5, 53, 22, 2, 923, 924, 3, 2, 2, 2, 924, 925, 8, 94, 10, 2, 925, 198, 3, 2, 2, 2, 926, 927, 5, 55, 23, 2, 927, 928, 3, 2, 2, 2, 928, 929, 8, 95, 10, 2, 929, 200, 3, 2, 2, 2, 930, 931, 5, 67, 29, 2, 931, 932, 3, 2, 2, 2, 932, 933, 8, 96, 13, 2, 933, 934, 8, 96, 14, 2, 934, 202, 3, 2, 2, 2, 935, 936, 5, 107, 49, 2, 936, 937, 3, 2, 2, 2, 937, 938, 8, 97, 19, 2, 938, 204, 3, 2, 2, 2, 939, 940, 5, 103, 47, 2, 940, 941, 3, 2, 2, 2, 941, 942, 8, 98, 16, 2, 942, 206, 3, 2, 2, 2, 943, 948, 5, 71, 31, 2, 944, 948, 5, 69, 30, 2, 945, 948, 5, 85, 38, 2, 946, 948, 5, 157, 74, 2, 947, 943, 3, 2, 2, 2, 947, 944, 3, 2, 2, 2, 947, 945, 3, 2, 2, 2, 947, 946, 3, 2, 2, 2, 948, 208, 3, 2, 2, 2, 949, 952, 5, 71, 31, 2, 950, 952, 5, 157, 74, 2, 951, 949, 3, 2, 2, 2, 951, 950, 3, 2, 2, 2, 952, 956, 3, 2, 2, 2, 953, 955, 5, 207, 99, 2, 954, 953, 3, 2, 2, 2, 955, 958, 3, 2, 2, 2, 956, 954, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 969, 3, 2, 2, 2, 958, 956, 3, 2, 2, 2, 959, 962, 5, 85, 38, 2, 960, 962, 5, 79, 35, 2, 961, 959, 3, 2, 2, 2, 961, 960, 3, 2, 2, 2, 962, 964, 3, 2, 2, 2, 963, 965, 5, 207, 99, 2, 964, 963, 3, 2, 2, 2, 965, 966, 3, 2, 2, 2, 966, 964, 3, 2, 2, 2, 966, 967, 3, 2, 2, 2, 967, 969, 3, 2, 2, 2, 968, 951, 3, 2, 2, 2, 968, 961, 3, 2, 2, 2, 969, 210, 3, 2, 2, 2, 970, 971, 5, 209, 100, 2, 971, 972, 3, 2, 2, 2, 972, 973, 8, 101, 20, 2, 973, 212, 3, 2, 2, 2, 974, 975, 5, 169, 80, 2, 975, 976, 3, 2, 2, 2, 976, 977, 8, 102, 18, 2, 977, 214, 3, 2, 2, 2, 978, 979, 5, 51, 21, 2, 979, 980, 3, 2, 2, 2, 980, 981, 8, 103, 10, 2, 981, 216, 3, 2, 2, 2, 982, 983, 5, 53, 22, 2, 983, 984, 3, 2, 2, 2, 984, 985, 8, 104, 10, 2, 985, 218, 3, 2, 2, 2, 986, 987, 5, 55, 23, 2, 987, 988, 3, 2, 2, 2, 988, 989, 8, 105, 10, 2, 989, 220, 3, 2, 2, 2, 990, 991, 5, 67, 29, 2, 991, 992, 3, 2, 2, 2, 992, 993, 8, 106, 13, 2, 993, 994, 8, 106, 14, 2, 994, 222, 3, 2, 2, 2, 995, 996, 5, 101, 46, 2, 996, 997, 3, 2, 2, 2, 997, 998, 8, 107, 17, 2, 998, 224, 3, 2, 2, 2, 999, 1000, 5, 103, 47, 2, 1000, 1001, 3, 2, 2, 2, 1001, 1002, 8, 108, 16, 2, 1002, 226, 3, 2, 2, 2, 1003, 1004, 5, 107, 49, 2, 1004, 1005, 3, 2, 2, 2, 1005, 1006, 8, 109, 19, 2, 1006, 228, 3, 2, 2, 2, 1007, 1008, 5, 321, 156, 2, 1008, 1009, 5, 357, 174, 2, 1009, 230, 3, 2, 2, 2, 1010, 1011, 5, 169, 80, 2, 1011, 1012, 3, 2, 2, 2, 1012, 1013, 8, 111, 18, 2, 1013, 232, 3, 2, 2, 2, 1014, 1015, 5, 209, 100, 2, 1015, 1016, 3, 2, 2, 2, 1016, 1017, 8, 112, 20, 2, 1017, 234, 3, 2, 2, 2, 1018, 1019, 5, 51, 21, 2, 1019, 1020, 3, 2, 2, 2, 1020, 1021, 8, 113, 10, 2, 1021, 236, 3, 2, 2, 2, 1022, 1023, 5, 53, 22, 2, 1023, 1024, 3, 2, 2, 2, 1024, 1025, 8, 114, 10, 2, 1025, 238, 3, 2, 2, 2, 1026, 1027, 5, 55, 23, 2, 1027, 1028, 3, 2, 2, 2, 1028, 1029, 8, 115, 10, 2, 1029, 240, 3, 2, 2, 2, 1030, 1031, 5, 67, 29, 2, 1031, 1032, 3, 2, 2, 2, 1032, 1033, 8, 116, 13, 2, 1033, 1034, 8, 116, 14, 2, 1034, 242, 3, 2, 2, 2, 1035, 1036, 5, 163, 77, 2, 1036, 1037, 3, 2, 2, 2, 1037, 1038, 8, 117, 11, 2, 1038, 1039, 8, 117, 21, 2, 1039, 244, 3, 2, 2, 2, 1040, 1041, 5, 349, 170, 2, 1041, 1042, 5, 347, 169, 2, 1042, 1043, 3, 2, 2, 2, 1043, 1044, 8, 118, 22, 2, 1044, 246, 3, 2, 2, 2, 1045, 1046, 5, 365, 178, 2, 1046, 1047, 5, 337, 164, 2, 1047, 1048, 5, 359, 175, 2, 1048, 1049, 5, 335, 163, 2, 1049, 1050, 3, 2, 2, 2, 1050, 1051, 8, 119, 22, 2, 1051, 248, 3, 2, 2, 2, 1052, 1053, 10, 14, 2, 2, 1053, 250, 3, 2, 2, 2, 1054, 1057, 5, 71, 31, 2, 1055, 1057, 5, 69, 30, 2, 1056, 1054, 3, 2, 2, 2, 1056, 1055, 3, 2, 2, 2, 1057, 1061, 3, 2, 2, 2, 1058, 1060, 5, 249, 120, 2, 1059, 1058, 3, 2, 2, 2, 1060, 1063, 3, 2, 2, 2, 1061, 1059, 3, 2, 2, 2, 1061, 1062, 3, 2, 2, 2, 1062, 252, 3, 2, 2, 2, 1063, 1061, 3, 2, 2, 2, 1064, 1065, 5, 169, 80, 2, 1065, 1066, 3, 2, 2, 2, 1066, 1067, 8, 122, 18, 2, 1067, 254, 3, 2, 2, 2, 1068, 1069, 5, 251, 121, 2, 1069, 1070, 3, 2, 2, 2, 1070, 1071, 8, 123, 23, 2, 1071, 256, 3, 2, 2, 2, 1072, 1073, 5, 51, 21, 2, 1073, 1074, 3, 2, 2, 2, 1074, 1075, 8, 124, 10, 2, 1075, 258, 3, 2, 2, 2, 1076, 1077, 5, 53, 22, 2, 1077, 1078, 3, 2, 2, 2, 1078, 1079, 8, 125, 10, 2, 1079, 260, 3, 2, 2, 2, 1080, 1081, 5, 55, 23, 2, 1081, 1082, 3, 2, 2, 2, 1082, 1083, 8, 126, 10, 2, 1083, 262, 3, 2, 2, 2, 1084, 1085, 5, 67, 29, 2, 1085, 1086, 3, 2, 2, 2, 1086, 1087, 8, 127, 13, 2, 1087, 1088, 8, 127, 14, 2, 1088, 1089, 8, 127, 14, 2, 1089, 264, 3, 2, 2, 2, 1090, 1091, 5, 101, 46, 2, 1091, 1092, 3, 2, 2, 2, 1092, 1093, 8, 128, 17, 2, 1093, 266, 3, 2, 2, 2, 1094, 1095, 5, 103, 47, 2, 1095, 1096, 3, 2, 2, 2, 1096, 1097, 8, 129, 16, 2, 1097, 268, 3, 2, 2, 2, 1098, 1099, 5, 107, 49, 2, 1099, 1100, 3, 2, 2, 2, 1100, 1101, 8, 130, 19, 2, 1101, 270, 3, 2, 2, 2, 1102, 1103, 5, 247, 119, 2, 1103, 1104, 3, 2, 2, 2, 1104, 1105, 8, 131, 24, 2, 1105, 272, 3, 2, 2, 2, 1106, 1107, 5, 209, 100, 2, 1107, 1108, 3, 2, 2, 2, 1108, 1109, 8, 132, 20, 2, 1109, 274, 3, 2, 2, 2, 1110, 1111, 5, 169, 80, 2, 1111, 1112, 3, 2, 2, 2, 1112, 1113, 8, 133, 18, 2, 1113, 276, 3, 2, 2, 2, 1114, 1115, 5, 51, 21, 2, 1115, 1116, 3, 2, 2, 2, 1116, 1117, 8, 134, 10, 2, 1117, 278, 3, 2, 2, 2, 1118, 1119, 5, 53, 22, 2, 1119, 1120, 3, 2, 2, 2, 1120, 1121, 8, 135, 10, 2, 1121, 280, 3, 2, 2, 2, 1122, 1123, 5, 55, 23, 2, 1123, 1124, 3, 2, 2, 2, 1124, 1125, 8, 136, 10, 2, 1125, 282, 3, 2, 2, 2, 1126, 1127, 5, 67, 29, 2, 1127, 1128, 3, 2, 2, 2, 1128, 1129, 8, 137, 13, 2, 1129, 1130, 8, 137, 14, 2, 1130, 284, 3, 2, 2, 2, 1131, 1132, 5, 107, 49, 2, 1132, 1133, 3, 2, 2, 2, 1133, 1134, 8, 138, 19, 2, 1134, 286, 3, 2, 2, 2, 1135, 1136, 5, 169, 80, 2, 1136, 1137, 3, 2, 2, 2, 1137, 1138, 8, 139, 18, 2, 1138, 288, 3, 2, 2, 2, 1139, 1140, 5, 167, 79, 2, 1140, 1141, 3, 2, 2, 2, 1141, 1142, 8, 140, 25, 2, 1142, 290, 3, 2, 2, 2, 1143, 1144, 5, 51, 21, 2, 1144, 1145, 3, 2, 2, 2, 1145, 1146, 8, 141, 10, 2, 1146, 292, 3, 2, 2, 2, 1147, 1148, 5, 53, 22, 2, 1148, 1149, 3, 2, 2, 2, 1149, 1150, 8, 142, 10, 2, 1150, 294, 3, 2, 2, 2, 1151, 1152, 5, 55, 23, 2, 1152, 1153, 3, 2, 2, 2, 1153, 1154, 8, 143, 10, 2, 1154, 296, 3, 2, 2, 2, 1155, 1156, 5, 67, 29, 2, 1156, 1157, 3, 2, 2, 2, 1157, 1158, 8, 144, 13, 2, 1158, 1159, 8, 144, 14, 2, 1159, 298, 3, 2, 2, 2, 1160, 1161, 5, 337, 164, 2, 1161, 1162, 5, 347, 169, 2, 1162, 1163, 5, 331, 161, 2, 1163, 1164, 5, 349, 170, 2, 1164, 300, 3, 2, 2, 2, 1165, 1166, 5, 331, 161, 2, 1166, 1167, 5, 361, 176, 2, 1167, 1168, 5, 347, 169, 2, 1168, 1169, 5, 325, 158, 2, 1169, 1170, 5, 359, 175, 2, 1170, 1171, 5, 337, 164, 2, 1171, 1172, 5, 349, 170, 2, 1172, 1173, 5, 347, 169, 2, 1173, 1174, 5, 357, 174, 2, 1174, 302, 3, 2, 2, 2, 1175, 1176, 5, 51, 21, 2, 1176, 1177, 3, 2, 2, 2, 1177, 1178, 8, 147, 10, 2, 1178, 304, 3, 2, 2, 2, 1179, 1180, 5, 53, 22, 2, 1180, 1181, 3, 2, 2, 2, 1181, 1182, 8, 148, 10, 2, 1182, 306, 3, 2, 2, 2, 1183, 1184, 5, 55, 23, 2, 1184, 1185, 3, 2, 2, 2, 1185, 1186, 8, 149, 10, 2, 1186, 308, 3, 2, 2, 2, 1187, 1188, 5, 165, 78, 2, 1188, 1189, 3, 2, 2, 2, 1189, 1190, 8, 150, 15, 2, 1190, 1191, 8, 150, 14, 2, 1191, 310, 3, 2, 2, 2, 1192, 1193, 7, 60, 2, 2, 1193, 312, 3, 2, 2, 2, 1194, 1200, 5, 79, 35, 2, 1195, 1200, 5, 69, 30, 2, 1196, 1200, 5, 107, 49, 2, 1197, 1200, 5, 71, 31, 2, 1198, 1200, 5, 85, 38, 2, 1199, 1194, 3, 2, 2, 2, 1199, 1195, 3, 2, 2, 2, 1199, 1196, 3, 2, 2, 2, 1199, 1197, 3, 2, 2, 2, 1199, 1198, 3, 2, 2, 2, 1200, 1201, 3, 2, 2, 2, 1201, 1199, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 314, 3, 2, 2, 2, 1203, 1204, 5, 51, 21, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 8, 153, 10, 2, 1206, 316, 3, 2, 2, 2, 1207, 1208, 5, 53, 22, 2, 1208, 1209, 3, 2, 2, 2, 1209, 1210, 8, 154, 10, 2, 1210, 318, 3, 2, 2, 2, 1211, 1212, 5, 55, 23, 2, 1212, 1213, 3, 2, 2, 2, 1213, 1214, 8, 155, 10, 2, 1214, 320, 3, 2, 2, 2, 1215, 1216, 9, 15, 2, 2, 1216, 322, 3, 2, 2, 2, 1217, 1218, 9, 16, 2, 2, 1218, 324, 3, 2, 2, 2, 1219, 1220, 9, 17, 2, 2, 1220, 326, 3, 2, 2, 2, 1221, 1222, 9, 18, 2, 2, 1222, 328, 3, 2, 2, 2, 1223, 1224, 9, 9, 2, 2, 1224, 330, 3, 2, 2, 2, 1225, 1226, 9, 19, 2, 2, 1226, 332, 3, 2, 2, 2, 1227, 1228, 9, 20, 2, 2, 1228, 334, 3, 2, 2, 2, 1229, 1230, 9, 21, 2, 2, 1230, 336, 3, 2, 2, 2, 1231, 1232, 9, 22, 2, 2, 1232, 338, 3, 2, 2, 2, 1233, 1234, 9, 23, 2, 2, 1234, 340, 3, 2, 2, 2, 1235, 1236, 9, 24, 2, 2, 1236, 342, 3, 2, 2, 2, 1237, 1238, 9, 25, 2, 2, 1238, 344, 3, 2, 2, 2, 1239, 1240, 9, 26, 2, 2, 1240, 346, 3, 2, 2, 2, 1241, 1242, 9, 27, 2, 2, 1242, 348, 3, 2, 2, 2, 1243, 1244, 9, 28, 2, 2, 1244, 350, 3, 2, 2, 2, 1245, 1246, 9, 29, 2, 2, 1246, 352, 3, 2, 2, 2, 1247, 1248, 9, 30, 2, 2, 1248, 354, 3, 2, 2, 2, 1249, 1250, 9, 31, 2, 2, 1250, 356, 3, 2, 2, 2, 1251, 1252, 9, 32, 2, 2, 1252, 358, 3, 2, 2, 2, 1253, 1254, 9, 33, 2, 2, 1254, 360, 3, 2, 2, 2, 1255, 1256, 9, 34, 2, 2, 1256, 362, 3, 2, 2, 2, 1257, 1258, 9, 35, 2, 2, 1258, 364, 3, 2, 2, 2, 1259, 1260, 9, 36, 2, 2, 1260, 366, 3, 2, 2, 2, 1261, 1262, 9, 37, 2, 2, 1262, 368, 3, 2, 2, 2, 1263, 1264, 9, 38, 2, 2, 1264, 370, 3, 2, 2, 2, 1265, 1266, 9, 39, 2, 2, 1266, 372, 3, 2, 2, 2, 56, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 529, 539, 543, 546, 555, 557, 568, 609, 614, 623, 630, 635, 637, 648, 656, 659, 661, 666, 671, 677, 684, 689, 695, 698, 706, 710, 840, 845, 850, 852, 858, 907, 912, 947, 951, 956, 961, 966, 968, 1056, 1061, 1199, 1201, 26, 7, 4, 2, 7, 6, 2, 7, 8, 2, 7, 3, 2, 7, 5, 2, 7, 10, 2, 7, 7, 2, 7, 11, 2, 2, 3, 2, 9, 66, 2, 7, 2, 2, 9, 28, 2, 6, 2, 2, 9, 67, 2, 9, 36, 2, 9, 35, 2, 9, 69, 2, 9, 38, 2, 9, 78, 2, 7, 12, 2, 7, 9, 2, 9, 88, 2, 9, 87, 2, 9, 68, 2] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens index 073febb9e1783..4bdf0572a3b8a 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens @@ -50,58 +50,59 @@ RLIKE=49 RP=50 TRUE=51 EQ=52 -NEQ=53 -LT=54 -LTE=55 -GT=56 -GTE=57 -PLUS=58 -MINUS=59 -ASTERISK=60 -SLASH=61 -PERCENT=62 -OPENING_BRACKET=63 -CLOSING_BRACKET=64 -UNQUOTED_IDENTIFIER=65 -QUOTED_IDENTIFIER=66 -EXPR_LINE_COMMENT=67 -EXPR_MULTILINE_COMMENT=68 -EXPR_WS=69 -METADATA=70 -FROM_UNQUOTED_IDENTIFIER=71 -FROM_LINE_COMMENT=72 -FROM_MULTILINE_COMMENT=73 -FROM_WS=74 -UNQUOTED_ID_PATTERN=75 -PROJECT_LINE_COMMENT=76 -PROJECT_MULTILINE_COMMENT=77 -PROJECT_WS=78 -AS=79 -RENAME_LINE_COMMENT=80 -RENAME_MULTILINE_COMMENT=81 -RENAME_WS=82 -ON=83 -WITH=84 -ENRICH_POLICY_NAME=85 -ENRICH_LINE_COMMENT=86 -ENRICH_MULTILINE_COMMENT=87 -ENRICH_WS=88 -ENRICH_FIELD_LINE_COMMENT=89 -ENRICH_FIELD_MULTILINE_COMMENT=90 -ENRICH_FIELD_WS=91 -MVEXPAND_LINE_COMMENT=92 -MVEXPAND_MULTILINE_COMMENT=93 -MVEXPAND_WS=94 -INFO=95 -FUNCTIONS=96 -SHOW_LINE_COMMENT=97 -SHOW_MULTILINE_COMMENT=98 -SHOW_WS=99 -COLON=100 -SETTING=101 -SETTING_LINE_COMMENT=102 -SETTTING_MULTILINE_COMMENT=103 -SETTING_WS=104 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +OPENING_BRACKET=64 +CLOSING_BRACKET=65 +UNQUOTED_IDENTIFIER=66 +QUOTED_IDENTIFIER=67 +EXPR_LINE_COMMENT=68 +EXPR_MULTILINE_COMMENT=69 +EXPR_WS=70 +METADATA=71 +FROM_UNQUOTED_IDENTIFIER=72 +FROM_LINE_COMMENT=73 +FROM_MULTILINE_COMMENT=74 +FROM_WS=75 +UNQUOTED_ID_PATTERN=76 +PROJECT_LINE_COMMENT=77 +PROJECT_MULTILINE_COMMENT=78 +PROJECT_WS=79 +AS=80 +RENAME_LINE_COMMENT=81 +RENAME_MULTILINE_COMMENT=82 +RENAME_WS=83 +ON=84 +WITH=85 +ENRICH_POLICY_NAME=86 +ENRICH_LINE_COMMENT=87 +ENRICH_MULTILINE_COMMENT=88 +ENRICH_WS=89 +ENRICH_FIELD_LINE_COMMENT=90 +ENRICH_FIELD_MULTILINE_COMMENT=91 +ENRICH_FIELD_WS=92 +MVEXPAND_LINE_COMMENT=93 +MVEXPAND_MULTILINE_COMMENT=94 +MVEXPAND_WS=95 +INFO=96 +FUNCTIONS=97 +SHOW_LINE_COMMENT=98 +SHOW_MULTILINE_COMMENT=99 +SHOW_WS=100 +COLON=101 +SETTING=102 +SETTING_LINE_COMMENT=103 +SETTTING_MULTILINE_COMMENT=104 +SETTING_WS=105 '|'=26 '='=33 ','=34 @@ -110,15 +111,16 @@ SETTING_WS=104 '?'=48 ')'=50 '=='=52 -'!='=53 -'<'=54 -'<='=55 -'>'=56 -'>='=57 -'+'=58 -'-'=59 -'*'=60 -'/'=61 -'%'=62 -']'=64 -':'=100 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 +']'=65 +':'=101 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts index 220f6417faa08..1bea52f3e5f29 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts @@ -69,58 +69,59 @@ export class esql_lexer extends Lexer { public static readonly RP = 50; public static readonly TRUE = 51; public static readonly EQ = 52; - public static readonly NEQ = 53; - public static readonly LT = 54; - public static readonly LTE = 55; - public static readonly GT = 56; - public static readonly GTE = 57; - public static readonly PLUS = 58; - public static readonly MINUS = 59; - public static readonly ASTERISK = 60; - public static readonly SLASH = 61; - public static readonly PERCENT = 62; - public static readonly OPENING_BRACKET = 63; - public static readonly CLOSING_BRACKET = 64; - public static readonly UNQUOTED_IDENTIFIER = 65; - public static readonly QUOTED_IDENTIFIER = 66; - public static readonly EXPR_LINE_COMMENT = 67; - public static readonly EXPR_MULTILINE_COMMENT = 68; - public static readonly EXPR_WS = 69; - public static readonly METADATA = 70; - public static readonly FROM_UNQUOTED_IDENTIFIER = 71; - public static readonly FROM_LINE_COMMENT = 72; - public static readonly FROM_MULTILINE_COMMENT = 73; - public static readonly FROM_WS = 74; - public static readonly UNQUOTED_ID_PATTERN = 75; - public static readonly PROJECT_LINE_COMMENT = 76; - public static readonly PROJECT_MULTILINE_COMMENT = 77; - public static readonly PROJECT_WS = 78; - public static readonly AS = 79; - public static readonly RENAME_LINE_COMMENT = 80; - public static readonly RENAME_MULTILINE_COMMENT = 81; - public static readonly RENAME_WS = 82; - public static readonly ON = 83; - public static readonly WITH = 84; - public static readonly ENRICH_POLICY_NAME = 85; - public static readonly ENRICH_LINE_COMMENT = 86; - public static readonly ENRICH_MULTILINE_COMMENT = 87; - public static readonly ENRICH_WS = 88; - public static readonly ENRICH_FIELD_LINE_COMMENT = 89; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 90; - public static readonly ENRICH_FIELD_WS = 91; - public static readonly MVEXPAND_LINE_COMMENT = 92; - public static readonly MVEXPAND_MULTILINE_COMMENT = 93; - public static readonly MVEXPAND_WS = 94; - public static readonly INFO = 95; - public static readonly FUNCTIONS = 96; - public static readonly SHOW_LINE_COMMENT = 97; - public static readonly SHOW_MULTILINE_COMMENT = 98; - public static readonly SHOW_WS = 99; - public static readonly COLON = 100; - public static readonly SETTING = 101; - public static readonly SETTING_LINE_COMMENT = 102; - public static readonly SETTTING_MULTILINE_COMMENT = 103; - public static readonly SETTING_WS = 104; + public static readonly CIEQ = 53; + public static readonly NEQ = 54; + public static readonly LT = 55; + public static readonly LTE = 56; + public static readonly GT = 57; + public static readonly GTE = 58; + public static readonly PLUS = 59; + public static readonly MINUS = 60; + public static readonly ASTERISK = 61; + public static readonly SLASH = 62; + public static readonly PERCENT = 63; + public static readonly OPENING_BRACKET = 64; + public static readonly CLOSING_BRACKET = 65; + public static readonly UNQUOTED_IDENTIFIER = 66; + public static readonly QUOTED_IDENTIFIER = 67; + public static readonly EXPR_LINE_COMMENT = 68; + public static readonly EXPR_MULTILINE_COMMENT = 69; + public static readonly EXPR_WS = 70; + public static readonly METADATA = 71; + public static readonly FROM_UNQUOTED_IDENTIFIER = 72; + public static readonly FROM_LINE_COMMENT = 73; + public static readonly FROM_MULTILINE_COMMENT = 74; + public static readonly FROM_WS = 75; + public static readonly UNQUOTED_ID_PATTERN = 76; + public static readonly PROJECT_LINE_COMMENT = 77; + public static readonly PROJECT_MULTILINE_COMMENT = 78; + public static readonly PROJECT_WS = 79; + public static readonly AS = 80; + public static readonly RENAME_LINE_COMMENT = 81; + public static readonly RENAME_MULTILINE_COMMENT = 82; + public static readonly RENAME_WS = 83; + public static readonly ON = 84; + public static readonly WITH = 85; + public static readonly ENRICH_POLICY_NAME = 86; + public static readonly ENRICH_LINE_COMMENT = 87; + public static readonly ENRICH_MULTILINE_COMMENT = 88; + public static readonly ENRICH_WS = 89; + public static readonly ENRICH_FIELD_LINE_COMMENT = 90; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 91; + public static readonly ENRICH_FIELD_WS = 92; + public static readonly MVEXPAND_LINE_COMMENT = 93; + public static readonly MVEXPAND_MULTILINE_COMMENT = 94; + public static readonly MVEXPAND_WS = 95; + public static readonly INFO = 96; + public static readonly FUNCTIONS = 97; + public static readonly SHOW_LINE_COMMENT = 98; + public static readonly SHOW_MULTILINE_COMMENT = 99; + public static readonly SHOW_WS = 100; + public static readonly COLON = 101; + public static readonly SETTING = 102; + public static readonly SETTING_LINE_COMMENT = 103; + public static readonly SETTTING_MULTILINE_COMMENT = 104; + public static readonly SETTING_WS = 105; public static readonly EXPLAIN_MODE = 1; public static readonly EXPRESSION_MODE = 2; public static readonly FROM_MODE = 3; @@ -154,8 +155,8 @@ export class esql_lexer extends Lexer { "UNDERSCORE", "UNQUOTED_ID_BODY", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", - "RLIKE", "RP", "TRUE", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", - "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", + "RLIKE", "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", + "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COMMA", "FROM_ASSIGN", "METADATA", "FROM_UNQUOTED_IDENTIFIER_PART", @@ -188,13 +189,13 @@ export class esql_lexer extends Lexer { undefined, undefined, undefined, undefined, undefined, "'='", "','", undefined, "'.'", undefined, undefined, undefined, "'('", undefined, undefined, undefined, undefined, undefined, undefined, undefined, "'?'", undefined, "')'", undefined, - "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", - "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, + "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'/'", "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, "':'", + undefined, undefined, undefined, "':'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", @@ -204,8 +205,8 @@ export class esql_lexer extends Lexer { "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", - "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", - "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", + "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "UNQUOTED_ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", @@ -249,7 +250,7 @@ export class esql_lexer extends Lexer { private static readonly _serializedATNSegments: number = 3; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02j\u04EE\b\x01" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02k\u04F3\b\x01" + "\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\b\x01\x04\x02\t" + "\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07\t" + "\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04\x0E" + @@ -278,599 +279,602 @@ export class esql_lexer extends Lexer { "\t\xA5\x04\xA6\t\xA6\x04\xA7\t\xA7\x04\xA8\t\xA8\x04\xA9\t\xA9\x04\xAA" + "\t\xAA\x04\xAB\t\xAB\x04\xAC\t\xAC\x04\xAD\t\xAD\x04\xAE\t\xAE\x04\xAF" + "\t\xAF\x04\xB0\t\xB0\x04\xB1\t\xB1\x04\xB2\t\xB2\x04\xB3\t\xB3\x04\xB4" + - "\t\xB4\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" + - "\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + - "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x07" + - "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03" + - "\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03" + - "\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + - "\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\f\x03\f\x03\f\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10" + - "\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x06\x14\u020E\n\x14\r" + - "\x14\x0E\x14\u020F\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x07" + - "\x15\u0218\n\x15\f\x15\x0E\x15\u021B\v\x15\x03\x15\x05\x15\u021E\n\x15" + - "\x03\x15\x05\x15\u0221\n\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x07\x16\u022A\n\x16\f\x16\x0E\x16\u022D\v\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x17\x06\x17\u0235\n\x17\r\x17\x0E\x17" + - "\u0236\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19" + - "\x03\x19\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + - "\x03\x1B\x03\x1B\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D" + - "\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03 \x03 \x03 \x03!\x03" + - "!\x03\"\x03\"\x05\"\u0260\n\"\x03\"\x06\"\u0263\n\"\r\"\x0E\"\u0264\x03" + - "#\x03#\x03$\x03$\x03%\x03%\x03%\x05%\u026E\n%\x03&\x03&\x03\'\x03\'\x03" + - "\'\x05\'\u0275\n\'\x03(\x03(\x03(\x07(\u027A\n(\f(\x0E(\u027D\v(\x03(" + - "\x03(\x03(\x03(\x03(\x03(\x07(\u0285\n(\f(\x0E(\u0288\v(\x03(\x03(\x03" + - "(\x03(\x03(\x05(\u028F\n(\x03(\x05(\u0292\n(\x05(\u0294\n(\x03)\x06)\u0297" + - "\n)\r)\x0E)\u0298\x03*\x06*\u029C\n*\r*\x0E*\u029D\x03*\x03*\x07*\u02A2" + - "\n*\f*\x0E*\u02A5\v*\x03*\x03*\x06*\u02A9\n*\r*\x0E*\u02AA\x03*\x06*\u02AE" + - "\n*\r*\x0E*\u02AF\x03*\x03*\x07*\u02B4\n*\f*\x0E*\u02B7\v*\x05*\u02B9" + - "\n*\x03*\x03*\x03*\x03*\x06*\u02BF\n*\r*\x0E*\u02C0\x03*\x03*\x05*\u02C5" + - "\n*\x03+\x03+\x03+\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03-\x03.\x03.\x03" + - "/\x03/\x030\x030\x030\x030\x030\x031\x031\x032\x032\x032\x032\x032\x03" + - "2\x033\x033\x033\x033\x033\x033\x034\x034\x034\x034\x034\x035\x035\x03" + - "6\x036\x036\x037\x037\x037\x038\x038\x038\x038\x038\x039\x039\x039\x03" + - "9\x03:\x03:\x03:\x03:\x03:\x03;\x03;\x03;\x03;\x03;\x03;\x03<\x03<\x03" + - "<\x03=\x03=\x03>\x03>\x03>\x03>\x03>\x03>\x03?\x03?\x03@\x03@\x03@\x03" + - "@\x03@\x03A\x03A\x03A\x03B\x03B\x03B\x03C\x03C\x03D\x03D\x03D\x03E\x03" + - "E\x03F\x03F\x03F\x03G\x03G\x03H\x03H\x03I\x03I\x03J\x03J\x03K\x03K\x03" + - "L\x03L\x03L\x03L\x03L\x03M\x03M\x03M\x03M\x03M\x03N\x03N\x07N\u0342\n" + - "N\fN\x0EN\u0345\vN\x03N\x03N\x05N\u0349\nN\x03N\x06N\u034C\nN\rN\x0EN" + - "\u034D\x05N\u0350\nN\x03O\x03O\x06O\u0354\nO\rO\x0EO\u0355\x03O\x03O\x03" + - "P\x03P\x03P\x03P\x03Q\x03Q\x03Q\x03Q\x03R\x03R\x03R\x03R\x03S\x03S\x03" + - "S\x03S\x03S\x03T\x03T\x03T\x03T\x03U\x03U\x03U\x03U\x03V\x03V\x03V\x03" + - "V\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03X\x03X\x03X\x03X\x03X\x03" + - "Y\x03Y\x03Y\x05Y\u0387\nY\x03Z\x06Z\u038A\nZ\rZ\x0EZ\u038B\x03[\x03[\x03" + - "[\x03[\x03\\\x03\\\x03\\\x03\\\x03]\x03]\x03]\x03]\x03^\x03^\x03^\x03" + - "^\x03_\x03_\x03_\x03_\x03_\x03`\x03`\x03`\x03`\x03a\x03a\x03a\x03a\x03" + - "b\x03b\x03b\x03b\x05b\u03AF\nb\x03c\x03c\x05c\u03B3\nc\x03c\x07c\u03B6" + - "\nc\fc\x0Ec\u03B9\vc\x03c\x03c\x05c\u03BD\nc\x03c\x06c\u03C0\nc\rc\x0E" + - "c\u03C1\x05c\u03C4\nc\x03d\x03d\x03d\x03d\x03e\x03e\x03e\x03e\x03f\x03" + - "f\x03f\x03f\x03g\x03g\x03g\x03g\x03h\x03h\x03h\x03h\x03i\x03i\x03i\x03" + - "i\x03i\x03j\x03j\x03j\x03j\x03k\x03k\x03k\x03k\x03l\x03l\x03l\x03l\x03" + - "m\x03m\x03m\x03n\x03n\x03n\x03n\x03o\x03o\x03o\x03o\x03p\x03p\x03p\x03" + - "p\x03q\x03q\x03q\x03q\x03r\x03r\x03r\x03r\x03s\x03s\x03s\x03s\x03s\x03" + - "t\x03t\x03t\x03t\x03t\x03u\x03u\x03u\x03u\x03u\x03v\x03v\x03v\x03v\x03" + - "v\x03v\x03v\x03w\x03w\x03x\x03x\x05x\u041C\nx\x03x\x07x\u041F\nx\fx\x0E" + - "x\u0422\vx\x03y\x03y\x03y\x03y\x03z\x03z\x03z\x03z\x03{\x03{\x03{\x03" + - "{\x03|\x03|\x03|\x03|\x03}\x03}\x03}\x03}\x03~\x03~\x03~\x03~\x03~\x03" + - "~\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x80\x03\x80\x03\x80\x03\x80\x03" + - "\x81\x03\x81\x03\x81\x03\x81\x03\x82\x03\x82\x03\x82\x03\x82\x03\x83\x03" + - "\x83\x03\x83\x03\x83\x03\x84\x03\x84\x03\x84\x03\x84\x03\x85\x03\x85\x03" + - "\x85\x03\x85\x03\x86\x03\x86\x03\x86\x03\x86\x03\x87\x03\x87\x03\x87\x03" + - "\x87\x03\x88\x03\x88\x03\x88\x03\x88\x03\x88\x03\x89\x03\x89\x03\x89\x03" + - "\x89\x03\x8A\x03\x8A\x03\x8A\x03\x8A\x03\x8B\x03\x8B\x03\x8B\x03\x8B\x03" + - "\x8C\x03\x8C\x03\x8C\x03\x8C\x03\x8D\x03\x8D\x03\x8D\x03\x8D\x03\x8E\x03" + - "\x8E\x03\x8E\x03\x8E\x03\x8F\x03\x8F\x03\x8F\x03\x8F\x03\x8F\x03\x90\x03" + - "\x90\x03\x90\x03\x90\x03\x90\x03\x91\x03\x91\x03\x91\x03\x91\x03\x91\x03" + - "\x91\x03\x91\x03\x91\x03\x91\x03\x91\x03\x92\x03\x92\x03\x92\x03\x92\x03" + - "\x93\x03\x93\x03\x93\x03\x93\x03\x94\x03\x94\x03\x94\x03\x94\x03\x95\x03" + - "\x95\x03\x95\x03\x95\x03\x95\x03\x96\x03\x96\x03\x97\x03\x97\x03\x97\x03" + - "\x97\x03\x97\x06\x97\u04AB\n\x97\r\x97\x0E\x97\u04AC\x03\x98\x03\x98\x03" + - "\x98\x03\x98\x03\x99\x03\x99\x03\x99\x03\x99\x03\x9A\x03\x9A\x03\x9A\x03" + - "\x9A\x03\x9B\x03\x9B\x03\x9C\x03\x9C\x03\x9D\x03\x9D\x03\x9E\x03\x9E\x03" + - "\x9F\x03\x9F\x03\xA0\x03\xA0\x03\xA1\x03\xA1\x03\xA2\x03\xA2\x03\xA3\x03" + - "\xA3\x03\xA4\x03\xA4\x03\xA5\x03\xA5\x03\xA6\x03\xA6\x03\xA7\x03\xA7\x03" + - "\xA8\x03\xA8\x03\xA9\x03\xA9\x03\xAA\x03\xAA\x03\xAB\x03\xAB\x03\xAC\x03" + - "\xAC\x03\xAD\x03\xAD\x03\xAE\x03\xAE\x03\xAF\x03\xAF\x03\xB0\x03\xB0\x03" + - "\xB1\x03\xB1\x03\xB2\x03\xB2\x03\xB3\x03\xB3\x03\xB4\x03\xB4\x04\u022B" + - "\u0286\x02\x02\xB5\r\x02\x03\x0F\x02\x04\x11\x02\x05\x13\x02\x06\x15\x02" + - "\x07\x17\x02\b\x19\x02\t\x1B\x02\n\x1D\x02\v\x1F\x02\f!\x02\r#\x02\x0E" + - "%\x02\x0F\'\x02\x10)\x02\x11+\x02\x12-\x02\x13/\x02\x141\x02\x153\x02" + - "\x165\x02\x177\x02\x189\x02\x02;\x02\x02=\x02\x19?\x02\x1AA\x02\x1BC\x02" + - "\x1CE\x02\x02G\x02\x02I\x02\x02K\x02\x02M\x02\x02O\x02\x02Q\x02\x02S\x02" + - "\x02U\x02\x02W\x02\x02Y\x02\x1D[\x02\x1E]\x02\x1F_\x02 a\x02!c\x02\"e" + - "\x02#g\x02$i\x02%k\x02&m\x02\'o\x02(q\x02)s\x02*u\x02+w\x02,y\x02-{\x02" + - ".}\x02/\x7F\x020\x81\x021\x83\x022\x85\x023\x87\x024\x89\x025\x8B\x02" + - "6\x8D\x027\x8F\x028\x91\x029\x93\x02:\x95\x02;\x97\x02<\x99\x02=\x9B\x02" + - ">\x9D\x02?\x9F\x02@\xA1\x02A\xA3\x02B\xA5\x02C\xA7\x02D\xA9\x02E\xAB\x02" + - "F\xAD\x02G\xAF\x02\x02\xB1\x02\x02\xB3\x02\x02\xB5\x02\x02\xB7\x02\x02" + - "\xB9\x02H\xBB\x02\x02\xBD\x02I\xBF\x02\x02\xC1\x02J\xC3\x02K\xC5\x02L" + - "\xC7\x02\x02\xC9\x02\x02\xCB\x02\x02\xCD\x02\x02\xCF\x02M\xD1\x02\x02" + - "\xD3\x02\x02\xD5\x02N\xD7\x02O\xD9\x02P\xDB\x02\x02\xDD\x02\x02\xDF\x02" + - "\x02\xE1\x02\x02\xE3\x02Q\xE5\x02\x02\xE7\x02\x02\xE9\x02R\xEB\x02S\xED" + - "\x02T\xEF\x02\x02\xF1\x02\x02\xF3\x02U\xF5\x02V\xF7\x02\x02\xF9\x02W\xFB" + - "\x02\x02\xFD\x02\x02\xFF\x02X\u0101\x02Y\u0103\x02Z\u0105\x02\x02\u0107" + - "\x02\x02\u0109\x02\x02\u010B\x02\x02\u010D\x02\x02\u010F\x02\x02\u0111" + - "\x02\x02\u0113\x02[\u0115\x02\\\u0117\x02]\u0119\x02\x02\u011B\x02\x02" + - "\u011D\x02\x02\u011F\x02\x02\u0121\x02^\u0123\x02_\u0125\x02`\u0127\x02" + - "\x02\u0129\x02a\u012B\x02b\u012D\x02c\u012F\x02d\u0131\x02e\u0133\x02" + - "\x02\u0135\x02f\u0137\x02g\u0139\x02h\u013B\x02i\u013D\x02j\u013F\x02" + - "\x02\u0141\x02\x02\u0143\x02\x02\u0145\x02\x02\u0147\x02\x02\u0149\x02" + - "\x02\u014B\x02\x02\u014D\x02\x02\u014F\x02\x02\u0151\x02\x02\u0153\x02" + - "\x02\u0155\x02\x02\u0157\x02\x02\u0159\x02\x02\u015B\x02\x02\u015D\x02" + - "\x02\u015F\x02\x02\u0161\x02\x02\u0163\x02\x02\u0165\x02\x02\u0167\x02" + - "\x02\u0169\x02\x02\u016B\x02\x02\u016D\x02\x02\u016F\x02\x02\u0171\x02" + - "\x02\r\x02\x03\x04\x05\x06\x07\b\t\n\v\f(\b\x02\v\f\x0F\x0F\"\"11]]__" + - "\x04\x02\f\f\x0F\x0F\x05\x02\v\f\x0F\x0F\"\"\x03\x022;\x04\x02C\\c|\x07" + - "\x02$$^^ppttvv\x06\x02\f\f\x0F\x0F$$^^\x04\x02GGgg\x04\x02--//\x03\x02" + - "bb\f\x02\v\f\x0F\x0F\"\"..11??]]__bb~~\x04\x02,,11\r\x02\v\f\x0F\x0F\"" + - "\"$%..11<<>>@A^^~~\x04\x02CCcc\x04\x02DDdd\x04\x02EEee\x04\x02FFff\x04" + - "\x02HHhh\x04\x02IIii\x04\x02JJjj\x04\x02KKkk\x04\x02LLll\x04\x02MMmm\x04" + - "\x02NNnn\x04\x02OOoo\x04\x02PPpp\x04\x02QQqq\x04\x02RRrr\x04\x02SSss\x04" + - "\x02TTtt\x04\x02UUuu\x04\x02VVvv\x04\x02WWww\x04\x02XXxx\x04\x02YYyy\x04" + - "\x02ZZzz\x04\x02[[{{\x04\x02\\\\||\x02\u04EF\x02\r\x03\x02\x02\x02\x02" + - "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" + - "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" + - "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" + - "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" + - "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" + - "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" + - "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x039\x03\x02\x02\x02\x03;\x03\x02" + - "\x02\x02\x03=\x03\x02\x02\x02\x03?\x03\x02\x02\x02\x03A\x03\x02\x02\x02" + - "\x04C\x03\x02\x02\x02\x04Y\x03\x02\x02\x02\x04[\x03\x02\x02\x02\x04]\x03" + - "\x02\x02\x02\x04_\x03\x02\x02\x02\x04a\x03\x02\x02\x02\x04c\x03\x02\x02" + - "\x02\x04e\x03\x02\x02\x02\x04g\x03\x02\x02\x02\x04i\x03\x02\x02\x02\x04" + - "k\x03\x02\x02\x02\x04m\x03\x02\x02\x02\x04o\x03\x02\x02\x02\x04q\x03\x02" + - "\x02\x02\x04s\x03\x02\x02\x02\x04u\x03\x02\x02\x02\x04w\x03\x02\x02\x02" + - "\x04y\x03\x02\x02\x02\x04{\x03\x02\x02\x02\x04}\x03\x02\x02\x02\x04\x7F" + - "\x03\x02\x02\x02\x04\x81\x03\x02\x02\x02\x04\x83\x03\x02\x02\x02\x04\x85" + - "\x03\x02\x02\x02\x04\x87\x03\x02\x02\x02\x04\x89\x03\x02\x02\x02\x04\x8B" + - "\x03\x02\x02\x02\x04\x8D\x03\x02\x02\x02\x04\x8F\x03\x02\x02\x02\x04\x91" + - "\x03\x02\x02\x02\x04\x93\x03\x02\x02\x02\x04\x95\x03\x02\x02\x02\x04\x97" + - "\x03\x02\x02\x02\x04\x99\x03\x02\x02\x02\x04\x9B\x03\x02\x02\x02\x04\x9D" + - "\x03\x02\x02\x02\x04\x9F\x03\x02\x02\x02\x04\xA1\x03\x02\x02\x02\x04\xA3" + - "\x03\x02\x02\x02\x04\xA5\x03\x02\x02\x02\x04\xA7\x03\x02\x02\x02\x04\xA9" + - "\x03\x02\x02\x02\x04\xAB\x03\x02\x02\x02\x04\xAD\x03\x02\x02\x02\x05\xAF" + - "\x03\x02\x02\x02\x05\xB1\x03\x02\x02\x02\x05\xB3\x03\x02\x02\x02\x05\xB5" + - "\x03\x02\x02\x02\x05\xB7\x03\x02\x02\x02\x05\xB9\x03\x02\x02\x02\x05\xBD" + - "\x03\x02\x02\x02\x05\xBF\x03\x02\x02\x02\x05\xC1\x03\x02\x02\x02\x05\xC3" + - "\x03\x02\x02\x02\x05\xC5\x03\x02\x02\x02\x06\xC7\x03\x02\x02\x02\x06\xC9" + - "\x03\x02\x02\x02\x06\xCB\x03\x02\x02\x02\x06\xCF\x03\x02\x02\x02\x06\xD1" + - "\x03\x02\x02\x02\x06\xD3\x03\x02\x02\x02\x06\xD5\x03\x02\x02\x02\x06\xD7" + - "\x03\x02\x02\x02\x06\xD9\x03\x02\x02\x02\x07\xDB\x03\x02\x02\x02\x07\xDD" + - "\x03\x02\x02\x02\x07\xDF\x03\x02\x02\x02\x07\xE1\x03\x02\x02\x02\x07\xE3" + - "\x03\x02\x02\x02\x07\xE5\x03\x02\x02\x02\x07\xE7\x03\x02\x02\x02\x07\xE9" + - "\x03\x02\x02\x02\x07\xEB\x03\x02\x02\x02\x07\xED\x03\x02\x02\x02\b\xEF" + - "\x03\x02\x02\x02\b\xF1\x03\x02\x02\x02\b\xF3\x03\x02\x02\x02\b\xF5\x03" + - "\x02\x02\x02\b\xF9\x03\x02\x02\x02\b\xFB\x03\x02\x02\x02\b\xFD\x03\x02" + - "\x02\x02\b\xFF\x03\x02\x02\x02\b\u0101\x03\x02\x02\x02\b\u0103\x03\x02" + - "\x02\x02\t\u0105\x03\x02\x02\x02\t\u0107\x03\x02\x02\x02\t\u0109\x03\x02" + - "\x02\x02\t\u010B\x03\x02\x02\x02\t\u010D\x03\x02\x02\x02\t\u010F\x03\x02" + - "\x02\x02\t\u0111\x03\x02\x02\x02\t\u0113\x03\x02\x02\x02\t\u0115\x03\x02" + - "\x02\x02\t\u0117\x03\x02\x02\x02\n\u0119\x03\x02\x02\x02\n\u011B\x03\x02" + - "\x02\x02\n\u011D\x03\x02\x02\x02\n\u011F\x03\x02\x02\x02\n\u0121\x03\x02" + - "\x02\x02\n\u0123\x03\x02\x02\x02\n\u0125\x03\x02\x02\x02\v\u0127\x03\x02" + - "\x02\x02\v\u0129\x03\x02\x02\x02\v\u012B\x03\x02\x02\x02\v\u012D\x03\x02" + - "\x02\x02\v\u012F\x03\x02\x02\x02\v\u0131\x03\x02\x02\x02\f\u0133\x03\x02" + - "\x02\x02\f\u0135\x03\x02\x02\x02\f\u0137\x03\x02\x02\x02\f\u0139\x03\x02" + - "\x02\x02\f\u013B\x03\x02\x02\x02\f\u013D\x03\x02\x02\x02\r\u0173\x03\x02" + - "\x02\x02\x0F\u017D\x03\x02\x02\x02\x11\u0184\x03\x02\x02\x02\x13\u018D" + - "\x03\x02\x02\x02\x15\u0194\x03\x02\x02\x02\x17\u019E\x03\x02\x02\x02\x19" + - "\u01A5\x03\x02\x02\x02\x1B\u01AC\x03\x02\x02\x02\x1D\u01BA\x03\x02\x02" + - "\x02\x1F\u01C1\x03\x02\x02\x02!\u01C9\x03\x02\x02\x02#\u01D5\x03\x02\x02" + - "\x02%\u01DF\x03\x02\x02\x02\'\u01E8\x03\x02\x02\x02)\u01EE\x03\x02\x02" + - "\x02+\u01F5\x03\x02\x02\x02-\u01FC\x03\x02\x02\x02/\u0204\x03\x02\x02" + - "\x021\u020D\x03\x02\x02\x023\u0213\x03\x02\x02\x025\u0224\x03\x02\x02" + - "\x027\u0234\x03\x02\x02\x029\u023A\x03\x02\x02\x02;\u023F\x03\x02\x02" + - "\x02=\u0244\x03\x02\x02\x02?\u0248\x03\x02\x02\x02A\u024C\x03\x02\x02" + - "\x02C\u0250\x03\x02\x02\x02E\u0254\x03\x02\x02\x02G\u0256\x03\x02\x02" + - "\x02I\u0258\x03\x02\x02\x02K\u025B\x03\x02\x02\x02M\u025D\x03\x02\x02" + - "\x02O\u0266\x03\x02\x02\x02Q\u0268\x03\x02\x02\x02S\u026D\x03\x02\x02" + - "\x02U\u026F\x03\x02\x02\x02W\u0274\x03\x02\x02\x02Y\u0293\x03\x02\x02" + - "\x02[\u0296\x03\x02\x02\x02]\u02C4\x03\x02\x02\x02_\u02C6\x03\x02\x02" + - "\x02a\u02C9\x03\x02\x02\x02c\u02CD\x03\x02\x02\x02e\u02D1\x03\x02\x02" + - "\x02g\u02D3\x03\x02\x02\x02i\u02D5\x03\x02\x02\x02k\u02DA\x03\x02\x02" + - "\x02m\u02DC\x03\x02\x02\x02o\u02E2\x03\x02\x02\x02q\u02E8\x03\x02\x02" + - "\x02s\u02ED\x03\x02\x02\x02u\u02EF\x03\x02\x02\x02w\u02F2\x03\x02\x02" + - "\x02y\u02F5\x03\x02\x02\x02{\u02FA\x03\x02\x02\x02}\u02FE\x03\x02\x02" + - "\x02\x7F\u0303\x03\x02\x02\x02\x81\u0309\x03\x02\x02\x02\x83\u030C\x03" + - "\x02\x02\x02\x85\u030E\x03\x02\x02\x02\x87\u0314\x03\x02\x02\x02\x89\u0316" + - "\x03\x02\x02\x02\x8B\u031B\x03\x02\x02\x02\x8D\u031E\x03\x02\x02\x02\x8F" + - "\u0321\x03\x02\x02\x02\x91\u0323\x03\x02\x02\x02\x93\u0326\x03\x02\x02" + - "\x02\x95\u0328\x03\x02\x02\x02\x97\u032B\x03\x02\x02\x02\x99\u032D\x03" + - "\x02\x02\x02\x9B\u032F\x03\x02\x02\x02\x9D\u0331\x03\x02\x02\x02\x9F\u0333" + - "\x03\x02\x02\x02\xA1\u0335\x03\x02\x02\x02\xA3\u033A\x03\x02\x02\x02\xA5" + - "\u034F\x03\x02\x02\x02\xA7\u0351\x03\x02\x02\x02\xA9\u0359\x03\x02\x02" + - "\x02\xAB\u035D\x03\x02\x02\x02\xAD\u0361\x03\x02\x02\x02\xAF\u0365\x03" + - "\x02\x02\x02\xB1\u036A\x03\x02\x02\x02\xB3\u036E\x03\x02\x02\x02\xB5\u0372" + - "\x03\x02\x02\x02\xB7\u0376\x03\x02\x02\x02\xB9\u037A\x03\x02\x02\x02\xBB" + - "\u0386\x03\x02\x02\x02\xBD\u0389\x03\x02\x02\x02\xBF\u038D\x03\x02\x02" + - "\x02\xC1\u0391\x03\x02\x02\x02\xC3\u0395\x03\x02\x02\x02\xC5\u0399\x03" + - "\x02\x02\x02\xC7\u039D\x03\x02\x02\x02\xC9\u03A2\x03\x02\x02\x02\xCB\u03A6" + - "\x03\x02\x02\x02\xCD\u03AE\x03\x02\x02\x02\xCF\u03C3\x03\x02\x02\x02\xD1" + - "\u03C5\x03\x02\x02\x02\xD3\u03C9\x03\x02\x02\x02\xD5\u03CD\x03\x02\x02" + - "\x02\xD7\u03D1\x03\x02\x02\x02\xD9\u03D5\x03\x02\x02\x02\xDB\u03D9\x03" + - "\x02\x02\x02\xDD\u03DE\x03\x02\x02\x02\xDF\u03E2\x03\x02\x02\x02\xE1\u03E6" + - "\x03\x02\x02\x02\xE3\u03EA\x03\x02\x02\x02\xE5\u03ED\x03\x02\x02\x02\xE7" + - "\u03F1\x03\x02\x02\x02\xE9\u03F5\x03\x02\x02\x02\xEB\u03F9\x03\x02\x02" + - "\x02\xED\u03FD\x03\x02\x02\x02\xEF\u0401\x03\x02\x02\x02\xF1\u0406\x03" + - "\x02\x02\x02\xF3\u040B\x03\x02\x02\x02\xF5\u0410\x03\x02\x02\x02\xF7\u0417" + - "\x03\x02\x02\x02\xF9\u041B\x03\x02\x02\x02\xFB\u0423\x03\x02\x02\x02\xFD" + - "\u0427\x03\x02\x02\x02\xFF\u042B\x03\x02"; + "\t\xB4\x04\xB5\t\xB5\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + + "\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + + "\x03\x03\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + + "\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03" + + "\b\x03\b\x03\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03" + + "\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x03" + + "\n\x03\n\x03\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\f\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03" + + "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x10\x03" + + "\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x06\x14\u0210" + + "\n\x14\r\x14\x0E\x14\u0211\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x07\x15\u021A\n\x15\f\x15\x0E\x15\u021D\v\x15\x03\x15\x05\x15\u0220" + + "\n\x15\x03\x15\x05\x15\u0223\n\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x07\x16\u022C\n\x16\f\x16\x0E\x16\u022F\v\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17\x06\x17\u0237\n\x17\r\x17" + + "\x0E\x17\u0238\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A" + + "\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1D" + + "\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03 \x03 \x03" + + " \x03!\x03!\x03\"\x03\"\x05\"\u0262\n\"\x03\"\x06\"\u0265\n\"\r\"\x0E" + + "\"\u0266\x03#\x03#\x03$\x03$\x03%\x03%\x03%\x05%\u0270\n%\x03&\x03&\x03" + + "\'\x03\'\x03\'\x05\'\u0277\n\'\x03(\x03(\x03(\x07(\u027C\n(\f(\x0E(\u027F" + + "\v(\x03(\x03(\x03(\x03(\x03(\x03(\x07(\u0287\n(\f(\x0E(\u028A\v(\x03(" + + "\x03(\x03(\x03(\x03(\x05(\u0291\n(\x03(\x05(\u0294\n(\x05(\u0296\n(\x03" + + ")\x06)\u0299\n)\r)\x0E)\u029A\x03*\x06*\u029E\n*\r*\x0E*\u029F\x03*\x03" + + "*\x07*\u02A4\n*\f*\x0E*\u02A7\v*\x03*\x03*\x06*\u02AB\n*\r*\x0E*\u02AC" + + "\x03*\x06*\u02B0\n*\r*\x0E*\u02B1\x03*\x03*\x07*\u02B6\n*\f*\x0E*\u02B9" + + "\v*\x05*\u02BB\n*\x03*\x03*\x03*\x03*\x06*\u02C1\n*\r*\x0E*\u02C2\x03" + + "*\x03*\x05*\u02C7\n*\x03+\x03+\x03+\x03,\x03,\x03,\x03,\x03-\x03-\x03" + + "-\x03-\x03.\x03.\x03/\x03/\x030\x030\x030\x030\x030\x031\x031\x032\x03" + + "2\x032\x032\x032\x032\x033\x033\x033\x033\x033\x033\x034\x034\x034\x03" + + "4\x034\x035\x035\x036\x036\x036\x037\x037\x037\x038\x038\x038\x038\x03" + + "8\x039\x039\x039\x039\x03:\x03:\x03:\x03:\x03:\x03;\x03;\x03;\x03;\x03" + + ";\x03;\x03<\x03<\x03<\x03=\x03=\x03>\x03>\x03>\x03>\x03>\x03>\x03?\x03" + + "?\x03@\x03@\x03@\x03@\x03@\x03A\x03A\x03A\x03B\x03B\x03B\x03C\x03C\x03" + + "C\x03D\x03D\x03E\x03E\x03E\x03F\x03F\x03G\x03G\x03G\x03H\x03H\x03I\x03" + + "I\x03J\x03J\x03K\x03K\x03L\x03L\x03M\x03M\x03M\x03M\x03M\x03N\x03N\x03" + + "N\x03N\x03N\x03O\x03O\x07O\u0347\nO\fO\x0EO\u034A\vO\x03O\x03O\x05O\u034E" + + "\nO\x03O\x06O\u0351\nO\rO\x0EO\u0352\x05O\u0355\nO\x03P\x03P\x06P\u0359" + + "\nP\rP\x0EP\u035A\x03P\x03P\x03Q\x03Q\x03Q\x03Q\x03R\x03R\x03R\x03R\x03" + + "S\x03S\x03S\x03S\x03T\x03T\x03T\x03T\x03T\x03U\x03U\x03U\x03U\x03V\x03" + + "V\x03V\x03V\x03W\x03W\x03W\x03W\x03X\x03X\x03X\x03X\x03Y\x03Y\x03Y\x03" + + "Y\x03Y\x03Y\x03Y\x03Y\x03Y\x03Z\x03Z\x03Z\x05Z\u038C\nZ\x03[\x06[\u038F" + + "\n[\r[\x0E[\u0390\x03\\\x03\\\x03\\\x03\\\x03]\x03]\x03]\x03]\x03^\x03" + + "^\x03^\x03^\x03_\x03_\x03_\x03_\x03`\x03`\x03`\x03`\x03`\x03a\x03a\x03" + + "a\x03a\x03b\x03b\x03b\x03b\x03c\x03c\x03c\x03c\x05c\u03B4\nc\x03d\x03" + + "d\x05d\u03B8\nd\x03d\x07d\u03BB\nd\fd\x0Ed\u03BE\vd\x03d\x03d\x05d\u03C2" + + "\nd\x03d\x06d\u03C5\nd\rd\x0Ed\u03C6\x05d\u03C9\nd\x03e\x03e\x03e\x03" + + "e\x03f\x03f\x03f\x03f\x03g\x03g\x03g\x03g\x03h\x03h\x03h\x03h\x03i\x03" + + "i\x03i\x03i\x03j\x03j\x03j\x03j\x03j\x03k\x03k\x03k\x03k\x03l\x03l\x03" + + "l\x03l\x03m\x03m\x03m\x03m\x03n\x03n\x03n\x03o\x03o\x03o\x03o\x03p\x03" + + "p\x03p\x03p\x03q\x03q\x03q\x03q\x03r\x03r\x03r\x03r\x03s\x03s\x03s\x03" + + "s\x03t\x03t\x03t\x03t\x03t\x03u\x03u\x03u\x03u\x03u\x03v\x03v\x03v\x03" + + "v\x03v\x03w\x03w\x03w\x03w\x03w\x03w\x03w\x03x\x03x\x03y\x03y\x05y\u0421" + + "\ny\x03y\x07y\u0424\ny\fy\x0Ey\u0427\vy\x03z\x03z\x03z\x03z\x03{\x03{" + + "\x03{\x03{\x03|\x03|\x03|\x03|\x03}\x03}\x03}\x03}\x03~\x03~\x03~\x03" + + "~\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x7F\x03\x80\x03\x80\x03" + + "\x80\x03\x80\x03\x81\x03\x81\x03\x81\x03\x81\x03\x82\x03\x82\x03\x82\x03" + + "\x82\x03\x83\x03\x83\x03\x83\x03\x83\x03\x84\x03\x84\x03\x84\x03\x84\x03" + + "\x85\x03\x85\x03\x85\x03\x85\x03\x86\x03\x86\x03\x86\x03\x86\x03\x87\x03" + + "\x87\x03\x87\x03\x87\x03\x88\x03\x88\x03\x88\x03\x88\x03\x89\x03\x89\x03" + + "\x89\x03\x89\x03\x89\x03\x8A\x03\x8A\x03\x8A\x03\x8A\x03\x8B\x03\x8B\x03" + + "\x8B\x03\x8B\x03\x8C\x03\x8C\x03\x8C\x03\x8C\x03\x8D\x03\x8D\x03\x8D\x03" + + "\x8D\x03\x8E\x03\x8E\x03\x8E\x03\x8E\x03\x8F\x03\x8F\x03\x8F\x03\x8F\x03" + + "\x90\x03\x90\x03\x90\x03\x90\x03\x90\x03\x91\x03\x91\x03\x91\x03\x91\x03" + + "\x91\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03\x92\x03" + + "\x92\x03\x92\x03\x93\x03\x93\x03\x93\x03\x93\x03\x94\x03\x94\x03\x94\x03" + + "\x94\x03\x95\x03\x95\x03\x95\x03\x95\x03\x96\x03\x96\x03\x96\x03\x96\x03" + + "\x96\x03\x97\x03\x97\x03\x98\x03\x98\x03\x98\x03\x98\x03\x98\x06\x98\u04B0" + + "\n\x98\r\x98\x0E\x98\u04B1\x03\x99\x03\x99\x03\x99\x03\x99\x03\x9A\x03" + + "\x9A\x03\x9A\x03\x9A\x03\x9B\x03\x9B\x03\x9B\x03\x9B\x03\x9C\x03\x9C\x03" + + "\x9D\x03\x9D\x03\x9E\x03\x9E\x03\x9F\x03\x9F\x03\xA0\x03\xA0\x03\xA1\x03" + + "\xA1\x03\xA2\x03\xA2\x03\xA3\x03\xA3\x03\xA4\x03\xA4\x03\xA5\x03\xA5\x03" + + "\xA6\x03\xA6\x03\xA7\x03\xA7\x03\xA8\x03\xA8\x03\xA9\x03\xA9\x03\xAA\x03" + + "\xAA\x03\xAB\x03\xAB\x03\xAC\x03\xAC\x03\xAD\x03\xAD\x03\xAE\x03\xAE\x03" + + "\xAF\x03\xAF\x03\xB0\x03\xB0\x03\xB1\x03\xB1\x03\xB2\x03\xB2\x03\xB3\x03" + + "\xB3\x03\xB4\x03\xB4\x03\xB5\x03\xB5\x04\u022D\u0288\x02\x02\xB6\r\x02" + + "\x03\x0F\x02\x04\x11\x02\x05\x13\x02\x06\x15\x02\x07\x17\x02\b\x19\x02" + + "\t\x1B\x02\n\x1D\x02\v\x1F\x02\f!\x02\r#\x02\x0E%\x02\x0F\'\x02\x10)\x02" + + "\x11+\x02\x12-\x02\x13/\x02\x141\x02\x153\x02\x165\x02\x177\x02\x189\x02" + + "\x02;\x02\x02=\x02\x19?\x02\x1AA\x02\x1BC\x02\x1CE\x02\x02G\x02\x02I\x02" + + "\x02K\x02\x02M\x02\x02O\x02\x02Q\x02\x02S\x02\x02U\x02\x02W\x02\x02Y\x02" + + "\x1D[\x02\x1E]\x02\x1F_\x02 a\x02!c\x02\"e\x02#g\x02$i\x02%k\x02&m\x02" + + "\'o\x02(q\x02)s\x02*u\x02+w\x02,y\x02-{\x02.}\x02/\x7F\x020\x81\x021\x83" + + "\x022\x85\x023\x87\x024\x89\x025\x8B\x026\x8D\x027\x8F\x028\x91\x029\x93" + + "\x02:\x95\x02;\x97\x02<\x99\x02=\x9B\x02>\x9D\x02?\x9F\x02@\xA1\x02A\xA3" + + "\x02B\xA5\x02C\xA7\x02D\xA9\x02E\xAB\x02F\xAD\x02G\xAF\x02H\xB1\x02\x02" + + "\xB3\x02\x02\xB5\x02\x02\xB7\x02\x02\xB9\x02\x02\xBB\x02I\xBD\x02\x02" + + "\xBF\x02J\xC1\x02\x02\xC3\x02K\xC5\x02L\xC7\x02M\xC9\x02\x02\xCB\x02\x02" + + "\xCD\x02\x02\xCF\x02\x02\xD1\x02N\xD3\x02\x02\xD5\x02\x02\xD7\x02O\xD9" + + "\x02P\xDB\x02Q\xDD\x02\x02\xDF\x02\x02\xE1\x02\x02\xE3\x02\x02\xE5\x02" + + "R\xE7\x02\x02\xE9\x02\x02\xEB\x02S\xED\x02T\xEF\x02U\xF1\x02\x02\xF3\x02" + + "\x02\xF5\x02V\xF7\x02W\xF9\x02\x02\xFB\x02X\xFD\x02\x02\xFF\x02\x02\u0101" + + "\x02Y\u0103\x02Z\u0105\x02[\u0107\x02\x02\u0109\x02\x02\u010B\x02\x02" + + "\u010D\x02\x02\u010F\x02\x02\u0111\x02\x02\u0113\x02\x02\u0115\x02\\\u0117" + + "\x02]\u0119\x02^\u011B\x02\x02\u011D\x02\x02\u011F\x02\x02\u0121\x02\x02" + + "\u0123\x02_\u0125\x02`\u0127\x02a\u0129\x02\x02\u012B\x02b\u012D\x02c" + + "\u012F\x02d\u0131\x02e\u0133\x02f\u0135\x02\x02\u0137\x02g\u0139\x02h" + + "\u013B\x02i\u013D\x02j\u013F\x02k\u0141\x02\x02\u0143\x02\x02\u0145\x02" + + "\x02\u0147\x02\x02\u0149\x02\x02\u014B\x02\x02\u014D\x02\x02\u014F\x02" + + "\x02\u0151\x02\x02\u0153\x02\x02\u0155\x02\x02\u0157\x02\x02\u0159\x02" + + "\x02\u015B\x02\x02\u015D\x02\x02\u015F\x02\x02\u0161\x02\x02\u0163\x02" + + "\x02\u0165\x02\x02\u0167\x02\x02\u0169\x02\x02\u016B\x02\x02\u016D\x02" + + "\x02\u016F\x02\x02\u0171\x02\x02\u0173\x02\x02\r\x02\x03\x04\x05\x06\x07" + + "\b\t\n\v\f(\b\x02\v\f\x0F\x0F\"\"11]]__\x04\x02\f\f\x0F\x0F\x05\x02\v" + + "\f\x0F\x0F\"\"\x03\x022;\x04\x02C\\c|\x07\x02$$^^ppttvv\x06\x02\f\f\x0F" + + "\x0F$$^^\x04\x02GGgg\x04\x02--//\x03\x02bb\f\x02\v\f\x0F\x0F\"\"..11?" + + "?]]__bb~~\x04\x02,,11\r\x02\v\f\x0F\x0F\"\"$%..11<<>>@A^^~~\x04\x02CC" + + "cc\x04\x02DDdd\x04\x02EEee\x04\x02FFff\x04\x02HHhh\x04\x02IIii\x04\x02" + + "JJjj\x04\x02KKkk\x04\x02LLll\x04\x02MMmm\x04\x02NNnn\x04\x02OOoo\x04\x02" + + "PPpp\x04\x02QQqq\x04\x02RRrr\x04\x02SSss\x04\x02TTtt\x04\x02UUuu\x04\x02" + + "VVvv\x04\x02WWww\x04\x02XXxx\x04\x02YYyy\x04\x02ZZzz\x04\x02[[{{\x04\x02" + + "\\\\||\x02\u04F4\x02\r\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11" + + "\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17" + + "\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D" + + "\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03" + + "\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02" + + "\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x02" + + "1\x03\x02\x02\x02\x023\x03\x02\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02" + + "\x02\x02\x039\x03\x02\x02\x02\x03;\x03\x02\x02\x02\x03=\x03\x02\x02\x02" + + "\x03?\x03\x02\x02\x02\x03A\x03\x02\x02\x02\x04C\x03\x02\x02\x02\x04Y\x03" + + "\x02\x02\x02\x04[\x03\x02\x02\x02\x04]\x03\x02\x02\x02\x04_\x03\x02\x02" + + "\x02\x04a\x03\x02\x02\x02\x04c\x03\x02\x02\x02\x04e\x03\x02\x02\x02\x04" + + "g\x03\x02\x02\x02\x04i\x03\x02\x02\x02\x04k\x03\x02\x02\x02\x04m\x03\x02" + + "\x02\x02\x04o\x03\x02\x02\x02\x04q\x03\x02\x02\x02\x04s\x03\x02\x02\x02" + + "\x04u\x03\x02\x02\x02\x04w\x03\x02\x02\x02\x04y\x03\x02\x02\x02\x04{\x03" + + "\x02\x02\x02\x04}\x03\x02\x02\x02\x04\x7F\x03\x02\x02\x02\x04\x81\x03" + + "\x02\x02\x02\x04\x83\x03\x02\x02\x02\x04\x85\x03\x02\x02\x02\x04\x87\x03" + + "\x02\x02\x02\x04\x89\x03\x02\x02\x02\x04\x8B\x03\x02\x02\x02\x04\x8D\x03" + + "\x02\x02\x02\x04\x8F\x03\x02\x02\x02\x04\x91\x03\x02\x02\x02\x04\x93\x03" + + "\x02\x02\x02\x04\x95\x03\x02\x02\x02\x04\x97\x03\x02\x02\x02\x04\x99\x03" + + "\x02\x02\x02\x04\x9B\x03\x02\x02\x02\x04\x9D\x03\x02\x02\x02\x04\x9F\x03" + + "\x02\x02\x02\x04\xA1\x03\x02\x02\x02\x04\xA3\x03\x02\x02\x02\x04\xA5\x03" + + "\x02\x02\x02\x04\xA7\x03\x02\x02\x02\x04\xA9\x03\x02\x02\x02\x04\xAB\x03" + + "\x02\x02\x02\x04\xAD\x03\x02\x02\x02\x04\xAF\x03\x02\x02\x02\x05\xB1\x03" + + "\x02\x02\x02\x05\xB3\x03\x02\x02\x02\x05\xB5\x03\x02\x02\x02\x05\xB7\x03" + + "\x02\x02\x02\x05\xB9\x03\x02\x02\x02\x05\xBB\x03\x02\x02\x02\x05\xBF\x03" + + "\x02\x02\x02\x05\xC1\x03\x02\x02\x02\x05\xC3\x03\x02\x02\x02\x05\xC5\x03" + + "\x02\x02\x02\x05\xC7\x03\x02\x02\x02\x06\xC9\x03\x02\x02\x02\x06\xCB\x03" + + "\x02\x02\x02\x06\xCD\x03\x02\x02\x02\x06\xD1\x03\x02\x02\x02\x06\xD3\x03" + + "\x02\x02\x02\x06\xD5\x03\x02\x02\x02\x06\xD7\x03\x02\x02\x02\x06\xD9\x03" + + "\x02\x02\x02\x06\xDB\x03\x02\x02\x02\x07\xDD\x03\x02\x02\x02\x07\xDF\x03" + + "\x02\x02\x02\x07\xE1\x03\x02\x02\x02\x07\xE3\x03\x02\x02\x02\x07\xE5\x03" + + "\x02\x02\x02\x07\xE7\x03\x02\x02\x02\x07\xE9\x03\x02\x02\x02\x07\xEB\x03" + + "\x02\x02\x02\x07\xED\x03\x02\x02\x02\x07\xEF\x03\x02\x02\x02\b\xF1\x03" + + "\x02\x02\x02\b\xF3\x03\x02\x02\x02\b\xF5\x03\x02\x02\x02\b\xF7\x03\x02" + + "\x02\x02\b\xFB\x03\x02\x02\x02\b\xFD\x03\x02\x02\x02\b\xFF\x03\x02\x02" + + "\x02\b\u0101\x03\x02\x02\x02\b\u0103\x03\x02\x02\x02\b\u0105\x03\x02\x02" + + "\x02\t\u0107\x03\x02\x02\x02\t\u0109\x03\x02\x02\x02\t\u010B\x03\x02\x02" + + "\x02\t\u010D\x03\x02\x02\x02\t\u010F\x03\x02\x02\x02\t\u0111\x03\x02\x02" + + "\x02\t\u0113\x03\x02\x02\x02\t\u0115\x03\x02\x02\x02\t\u0117\x03\x02\x02" + + "\x02\t\u0119\x03\x02\x02\x02\n\u011B\x03\x02\x02\x02\n\u011D\x03\x02\x02" + + "\x02\n\u011F\x03\x02\x02\x02\n\u0121\x03\x02\x02\x02\n\u0123\x03\x02\x02" + + "\x02\n\u0125\x03\x02\x02\x02\n\u0127\x03\x02\x02\x02\v\u0129\x03\x02\x02" + + "\x02\v\u012B\x03\x02\x02\x02\v\u012D\x03\x02\x02\x02\v\u012F\x03\x02\x02" + + "\x02\v\u0131\x03\x02\x02\x02\v\u0133\x03\x02\x02\x02\f\u0135\x03\x02\x02" + + "\x02\f\u0137\x03\x02\x02\x02\f\u0139\x03\x02\x02\x02\f\u013B\x03\x02\x02" + + "\x02\f\u013D\x03\x02\x02\x02\f\u013F\x03\x02\x02\x02\r\u0175\x03\x02\x02" + + "\x02\x0F\u017F\x03\x02\x02\x02\x11\u0186\x03\x02\x02\x02\x13\u018F\x03" + + "\x02\x02\x02\x15\u0196\x03\x02\x02\x02\x17\u01A0\x03\x02\x02\x02\x19\u01A7" + + "\x03\x02\x02\x02\x1B\u01AE\x03\x02\x02\x02\x1D\u01BC\x03\x02\x02\x02\x1F" + + "\u01C3\x03\x02\x02\x02!\u01CB\x03\x02\x02\x02#\u01D7\x03\x02\x02\x02%" + + "\u01E1\x03\x02\x02\x02\'\u01EA\x03\x02\x02\x02)\u01F0\x03\x02\x02\x02" + + "+\u01F7\x03\x02\x02\x02-\u01FE\x03\x02\x02\x02/\u0206\x03\x02\x02\x02" + + "1\u020F\x03\x02\x02\x023\u0215\x03\x02\x02\x025\u0226\x03\x02\x02\x02" + + "7\u0236\x03\x02\x02\x029\u023C\x03\x02\x02\x02;\u0241\x03\x02\x02\x02" + + "=\u0246\x03\x02\x02\x02?\u024A\x03\x02\x02\x02A\u024E\x03\x02\x02\x02" + + "C\u0252\x03\x02\x02\x02E\u0256\x03\x02\x02\x02G\u0258\x03\x02\x02\x02" + + "I\u025A\x03\x02\x02\x02K\u025D\x03\x02\x02\x02M\u025F\x03\x02\x02\x02" + + "O\u0268\x03\x02\x02\x02Q\u026A\x03\x02\x02\x02S\u026F\x03\x02\x02\x02" + + "U\u0271\x03\x02\x02\x02W\u0276\x03\x02\x02\x02Y\u0295\x03\x02\x02\x02" + + "[\u0298\x03\x02\x02\x02]\u02C6\x03\x02\x02\x02_\u02C8\x03\x02\x02\x02" + + "a\u02CB\x03\x02\x02\x02c\u02CF\x03\x02\x02\x02e\u02D3\x03\x02\x02\x02" + + "g\u02D5\x03\x02\x02\x02i\u02D7\x03\x02\x02\x02k\u02DC\x03\x02\x02\x02" + + "m\u02DE\x03\x02\x02\x02o\u02E4\x03\x02\x02\x02q\u02EA\x03\x02\x02\x02" + + "s\u02EF\x03\x02\x02\x02u\u02F1\x03\x02\x02\x02w\u02F4\x03\x02\x02\x02" + + "y\u02F7\x03\x02\x02\x02{\u02FC\x03\x02\x02\x02}\u0300\x03\x02\x02\x02" + + "\x7F\u0305\x03\x02\x02\x02\x81\u030B\x03\x02\x02\x02\x83\u030E\x03\x02" + + "\x02\x02\x85\u0310\x03\x02\x02\x02\x87\u0316\x03\x02\x02\x02\x89\u0318" + + "\x03\x02\x02\x02\x8B\u031D\x03\x02\x02\x02\x8D\u0320\x03\x02\x02\x02\x8F" + + "\u0323\x03\x02\x02\x02\x91\u0326\x03\x02\x02\x02\x93\u0328\x03\x02\x02" + + "\x02\x95\u032B\x03\x02\x02\x02\x97\u032D\x03\x02\x02\x02\x99\u0330\x03" + + "\x02\x02\x02\x9B\u0332\x03\x02\x02\x02\x9D\u0334\x03\x02\x02\x02\x9F\u0336" + + "\x03\x02\x02\x02\xA1\u0338\x03\x02\x02\x02\xA3\u033A\x03\x02\x02\x02\xA5" + + "\u033F\x03\x02\x02\x02\xA7\u0354\x03\x02\x02\x02\xA9\u0356\x03\x02\x02" + + "\x02\xAB\u035E\x03\x02\x02\x02\xAD\u0362\x03\x02\x02\x02\xAF\u0366\x03" + + "\x02\x02\x02\xB1\u036A\x03\x02\x02\x02\xB3\u036F\x03\x02\x02\x02\xB5\u0373" + + "\x03\x02\x02\x02\xB7\u0377\x03\x02\x02\x02\xB9\u037B\x03\x02\x02\x02\xBB" + + "\u037F\x03\x02\x02\x02\xBD\u038B\x03\x02\x02\x02\xBF\u038E\x03\x02\x02" + + "\x02\xC1\u0392\x03\x02\x02\x02\xC3\u0396\x03\x02\x02\x02\xC5\u039A\x03" + + "\x02\x02\x02\xC7\u039E\x03\x02\x02\x02\xC9\u03A2\x03\x02\x02\x02\xCB\u03A7" + + "\x03\x02\x02\x02\xCD\u03AB\x03\x02\x02\x02\xCF\u03B3\x03\x02\x02\x02\xD1" + + "\u03C8\x03\x02\x02\x02\xD3\u03CA\x03\x02\x02\x02\xD5\u03CE\x03\x02\x02" + + "\x02\xD7\u03D2\x03\x02\x02\x02\xD9\u03D6\x03\x02\x02\x02\xDB\u03DA\x03" + + "\x02\x02\x02\xDD\u03DE\x03\x02\x02\x02\xDF\u03E3\x03\x02\x02\x02\xE1\u03E7" + + "\x03\x02\x02\x02\xE3\u03EB\x03\x02\x02\x02\xE5\u03EF\x03\x02\x02\x02\xE7" + + "\u03F2\x03\x02\x02\x02\xE9\u03F6\x03\x02\x02\x02\xEB\u03FA\x03\x02\x02" + + "\x02\xED\u03FE\x03\x02\x02\x02\xEF\u0402\x03\x02\x02\x02\xF1\u0406\x03" + + "\x02\x02\x02\xF3\u040B\x03\x02\x02\x02\xF5\u0410\x03\x02\x02\x02\xF7\u0415" + + "\x03\x02\x02\x02\xF9\u041C\x03"; private static readonly _serializedATNSegment1: string = - "\x02\x02\u0101\u042F\x03\x02\x02\x02\u0103\u0433\x03\x02\x02\x02\u0105" + - "\u0437\x03\x02\x02\x02\u0107\u043D\x03\x02\x02\x02\u0109\u0441\x03\x02" + - "\x02\x02\u010B\u0445\x03\x02\x02\x02\u010D\u0449\x03\x02\x02\x02\u010F" + - "\u044D\x03\x02\x02\x02\u0111\u0451\x03\x02\x02\x02\u0113\u0455\x03\x02" + - "\x02\x02\u0115\u0459\x03\x02\x02\x02\u0117\u045D\x03\x02\x02\x02\u0119" + - "\u0461\x03\x02\x02\x02\u011B\u0466\x03\x02\x02\x02\u011D\u046A\x03\x02" + - "\x02\x02\u011F\u046E\x03\x02\x02\x02\u0121\u0472\x03\x02\x02\x02\u0123" + - "\u0476\x03\x02\x02\x02\u0125\u047A\x03\x02\x02\x02\u0127\u047E\x03\x02" + + "\x02\x02\x02\xFB\u0420\x03\x02\x02\x02\xFD\u0428\x03\x02\x02\x02\xFF\u042C" + + "\x03\x02\x02\x02\u0101\u0430\x03\x02\x02\x02\u0103\u0434\x03\x02\x02\x02" + + "\u0105\u0438\x03\x02\x02\x02\u0107\u043C\x03\x02\x02\x02\u0109\u0442\x03" + + "\x02\x02\x02\u010B\u0446\x03\x02\x02\x02\u010D\u044A\x03\x02\x02\x02\u010F" + + "\u044E\x03\x02\x02\x02\u0111\u0452\x03\x02\x02\x02\u0113\u0456\x03\x02" + + "\x02\x02\u0115\u045A\x03\x02\x02\x02\u0117\u045E\x03\x02\x02\x02\u0119" + + "\u0462\x03\x02\x02\x02\u011B\u0466\x03\x02\x02\x02\u011D\u046B\x03\x02" + + "\x02\x02\u011F\u046F\x03\x02\x02\x02\u0121\u0473\x03\x02\x02\x02\u0123" + + "\u0477\x03\x02\x02\x02\u0125\u047B\x03\x02\x02\x02\u0127\u047F\x03\x02" + "\x02\x02\u0129\u0483\x03\x02\x02\x02\u012B\u0488\x03\x02\x02\x02\u012D" + - "\u0492\x03\x02\x02\x02\u012F\u0496\x03\x02\x02\x02\u0131\u049A\x03\x02" + - "\x02\x02\u0133\u049E\x03\x02\x02\x02\u0135\u04A3\x03\x02\x02\x02\u0137" + - "\u04AA\x03\x02\x02\x02\u0139\u04AE\x03\x02\x02\x02\u013B\u04B2\x03\x02" + - "\x02\x02\u013D\u04B6\x03\x02\x02\x02\u013F\u04BA\x03\x02\x02\x02\u0141" + - "\u04BC\x03\x02\x02\x02\u0143\u04BE\x03\x02\x02\x02\u0145\u04C0\x03\x02" + - "\x02\x02\u0147\u04C2\x03\x02\x02\x02\u0149\u04C4\x03\x02\x02\x02\u014B" + - "\u04C6\x03\x02\x02\x02\u014D\u04C8\x03\x02\x02\x02\u014F\u04CA\x03\x02" + - "\x02\x02\u0151\u04CC\x03\x02\x02\x02\u0153\u04CE\x03\x02\x02\x02\u0155" + - "\u04D0\x03\x02\x02\x02\u0157\u04D2\x03\x02\x02\x02\u0159\u04D4\x03\x02" + - "\x02\x02\u015B\u04D6\x03\x02\x02\x02\u015D\u04D8\x03\x02\x02\x02\u015F" + - "\u04DA\x03\x02\x02\x02\u0161\u04DC\x03\x02\x02\x02\u0163\u04DE\x03\x02" + - "\x02\x02\u0165\u04E0\x03\x02\x02\x02\u0167\u04E2\x03\x02\x02\x02\u0169" + - "\u04E4\x03\x02\x02\x02\u016B\u04E6\x03\x02\x02\x02\u016D\u04E8\x03\x02" + - "\x02\x02\u016F\u04EA\x03\x02\x02\x02\u0171\u04EC\x03\x02\x02\x02\u0173" + - "\u0174\x05\u0145\x9E\x02\u0174\u0175\x05\u014F\xA3\x02\u0175\u0176\x05" + - "\u0163\xAD\x02\u0176\u0177\x05\u0163\xAD\x02\u0177\u0178\x05\u0147\x9F" + - "\x02\u0178\u0179\x05\u0143\x9D\x02\u0179\u017A\x05\u0165\xAE\x02\u017A" + - "\u017B\x03\x02\x02\x02\u017B\u017C\b\x02\x02\x02\u017C\x0E\x03\x02\x02" + - "\x02\u017D\u017E\x05\u0145\x9E\x02\u017E\u017F\x05\u0161\xAC\x02\u017F" + - "\u0180\x05\u015B\xA9\x02\u0180\u0181\x05\u015D\xAA\x02\u0181\u0182\x03" + - "\x02\x02\x02\u0182\u0183\b\x03\x03\x02\u0183\x10\x03\x02\x02\x02\u0184" + - "\u0185\x05\u0147\x9F\x02\u0185\u0186\x05\u0159\xA8\x02\u0186\u0187\x05" + - "\u0161\xAC\x02\u0187\u0188\x05\u014F\xA3\x02\u0188\u0189\x05\u0143\x9D" + - "\x02\u0189\u018A\x05\u014D\xA2\x02\u018A\u018B\x03\x02\x02\x02\u018B\u018C" + - "\b\x04\x04\x02\u018C\x12\x03\x02\x02\x02\u018D\u018E\x05\u0147\x9F\x02" + - "\u018E\u018F\x05\u0169\xB0\x02\u018F\u0190\x05\u013F\x9B\x02\u0190\u0191" + - "\x05\u0155\xA6\x02\u0191\u0192\x03\x02\x02\x02\u0192\u0193\b\x05\x02\x02" + - "\u0193\x14\x03\x02\x02\x02\u0194\u0195\x05\u0147\x9F\x02\u0195\u0196\x05" + - "\u016D\xB2\x02\u0196\u0197\x05\u015D\xAA\x02\u0197\u0198\x05\u0155\xA6" + - "\x02\u0198\u0199\x05\u013F\x9B\x02\u0199\u019A\x05\u014F\xA3\x02\u019A" + - "\u019B\x05\u0159\xA8\x02\u019B\u019C\x03\x02\x02\x02\u019C\u019D\b\x06" + - "\x05\x02\u019D\x16\x03\x02\x02\x02\u019E\u019F\x05\u0149\xA0\x02\u019F" + - "\u01A0\x05\u0161\xAC\x02\u01A0\u01A1\x05\u015B\xA9\x02\u01A1\u01A2\x05" + - "\u0157\xA7\x02\u01A2\u01A3\x03\x02\x02\x02\u01A3\u01A4\b\x07\x06\x02\u01A4" + - "\x18\x03\x02\x02\x02\u01A5\u01A6\x05\u014B\xA1\x02\u01A6\u01A7\x05\u0161" + - "\xAC\x02\u01A7\u01A8\x05\u015B\xA9\x02\u01A8\u01A9\x05\u0153\xA5\x02\u01A9" + - "\u01AA\x03\x02\x02\x02\u01AA\u01AB\b\b\x02\x02\u01AB\x1A\x03\x02\x02\x02" + - "\u01AC\u01AD\x05\u014F\xA3\x02\u01AD\u01AE\x05\u0159\xA8\x02\u01AE\u01AF" + - "\x05\u0155\xA6\x02\u01AF\u01B0\x05\u014F\xA3\x02\u01B0\u01B1\x05\u0159" + - "\xA8\x02\u01B1\u01B2\x05\u0147\x9F\x02\u01B2\u01B3\x05\u0163\xAD\x02\u01B3" + - "\u01B4\x05\u0165\xAE\x02\u01B4\u01B5\x05\u013F\x9B\x02\u01B5\u01B6\x05" + - "\u0165\xAE\x02\u01B6\u01B7\x05\u0163\xAD\x02\u01B7\u01B8\x03\x02\x02\x02" + - "\u01B8\u01B9\b\t\x02\x02\u01B9\x1C\x03\x02\x02\x02\u01BA\u01BB\x05\u0153" + - "\xA5\x02\u01BB\u01BC\x05\u0147\x9F\x02\u01BC\u01BD\x05\u0147\x9F\x02\u01BD" + - "\u01BE\x05\u015D\xAA\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C0\b\n\x03" + - "\x02\u01C0\x1E\x03\x02\x02\x02\u01C1\u01C2\x05\u0155\xA6\x02\u01C2\u01C3" + - "\x05\u014F\xA3\x02\u01C3\u01C4\x05\u0157\xA7\x02\u01C4\u01C5\x05\u014F" + - "\xA3\x02\u01C5\u01C6\x05\u0165\xAE\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7" + - "\u01C8\b\v\x02\x02\u01C8 \x03\x02\x02\x02\u01C9\u01CA\x05\u0157\xA7\x02" + - "\u01CA\u01CB\x05\u0169\xB0\x02\u01CB\u01CC\x05U&\x02\u01CC\u01CD\x05\u0147" + - "\x9F\x02\u01CD\u01CE\x05\u016D\xB2\x02\u01CE\u01CF\x05\u015D\xAA\x02\u01CF" + - "\u01D0\x05\u013F\x9B\x02\u01D0\u01D1\x05\u0159\xA8\x02\u01D1\u01D2\x05" + - "\u0145\x9E\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\b\f\x07\x02\u01D4" + - "\"\x03\x02\x02\x02\u01D5\u01D6\x05\u015D\xAA\x02\u01D6\u01D7\x05\u0161" + - "\xAC\x02\u01D7\u01D8\x05\u015B\xA9\x02\u01D8\u01D9\x05\u0151\xA4\x02\u01D9" + - "\u01DA\x05\u0147\x9F\x02\u01DA\u01DB\x05\u0143\x9D\x02\u01DB\u01DC\x05" + - "\u0165\xAE\x02\u01DC\u01DD\x03\x02\x02\x02\u01DD\u01DE\b\r\x03\x02\u01DE" + - "$\x03\x02\x02\x02\u01DF\u01E0\x05\u0161\xAC\x02\u01E0\u01E1\x05\u0147" + - "\x9F\x02\u01E1\u01E2\x05\u0159\xA8\x02\u01E2\u01E3\x05\u013F\x9B\x02\u01E3" + - "\u01E4\x05\u0157\xA7\x02\u01E4\u01E5\x05\u0147\x9F\x02\u01E5\u01E6\x03" + - "\x02\x02\x02\u01E6\u01E7\b\x0E\b\x02\u01E7&\x03\x02\x02\x02\u01E8\u01E9" + - "\x05\u0161\xAC\x02\u01E9\u01EA\x05\u015B\xA9\x02\u01EA\u01EB\x05\u016B" + - "\xB1\x02\u01EB\u01EC\x03\x02\x02\x02\u01EC\u01ED\b\x0F\x02\x02\u01ED(" + - "\x03\x02\x02\x02\u01EE\u01EF\x05\u0163\xAD\x02\u01EF\u01F0\x05\u014D\xA2" + - "\x02\u01F0\u01F1\x05\u015B\xA9\x02\u01F1\u01F2\x05\u016B\xB1\x02\u01F2" + - "\u01F3\x03\x02\x02\x02\u01F3\u01F4\b\x10\t\x02\u01F4*\x03\x02\x02\x02" + - "\u01F5\u01F6\x05\u0163\xAD\x02\u01F6\u01F7\x05\u015B\xA9\x02\u01F7\u01F8" + - "\x05\u0161\xAC\x02\u01F8\u01F9\x05\u0165\xAE\x02\u01F9\u01FA\x03\x02\x02" + - "\x02\u01FA\u01FB\b\x11\x02\x02\u01FB,\x03\x02\x02\x02\u01FC\u01FD\x05" + - "\u0163\xAD\x02\u01FD\u01FE\x05\u0165\xAE\x02\u01FE\u01FF\x05\u013F\x9B" + - "\x02\u01FF\u0200\x05\u0165\xAE\x02\u0200\u0201\x05\u0163\xAD\x02\u0201" + - "\u0202\x03\x02\x02\x02\u0202\u0203\b\x12\x02\x02\u0203.\x03\x02\x02\x02" + - "\u0204\u0205\x05\u016B\xB1\x02\u0205\u0206\x05\u014D\xA2\x02\u0206\u0207" + - "\x05\u0147\x9F\x02\u0207\u0208\x05\u0161\xAC\x02\u0208\u0209\x05\u0147" + - "\x9F\x02\u0209\u020A\x03\x02\x02\x02\u020A\u020B\b\x13\x02\x02\u020B0" + - "\x03\x02\x02\x02\u020C\u020E\n\x02\x02\x02\u020D\u020C\x03\x02\x02\x02" + - "\u020E\u020F\x03\x02\x02\x02\u020F\u020D\x03\x02\x02\x02\u020F\u0210\x03" + - "\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211\u0212\b\x14\x02\x02\u0212" + - "2\x03\x02\x02\x02\u0213\u0214\x071\x02\x02\u0214\u0215\x071\x02\x02\u0215" + - "\u0219\x03\x02\x02\x02\u0216\u0218\n\x03\x02\x02\u0217\u0216\x03\x02\x02" + - "\x02\u0218\u021B\x03\x02\x02\x02\u0219\u0217\x03\x02\x02\x02\u0219\u021A" + - "\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B\u0219\x03\x02\x02\x02" + - "\u021C\u021E\x07\x0F\x02\x02\u021D\u021C\x03\x02\x02\x02\u021D\u021E\x03" + - "\x02\x02\x02\u021E\u0220\x03\x02\x02\x02\u021F\u0221\x07\f\x02\x02\u0220" + - "\u021F\x03\x02\x02\x02\u0220\u0221\x03\x02\x02\x02\u0221\u0222\x03\x02" + - "\x02\x02\u0222\u0223\b\x15\n\x02\u02234\x03\x02\x02\x02\u0224\u0225\x07" + - "1\x02\x02\u0225\u0226\x07,\x02\x02\u0226\u022B\x03\x02\x02\x02\u0227\u022A" + - "\x055\x16\x02\u0228\u022A\v\x02\x02\x02\u0229\u0227\x03\x02\x02\x02\u0229" + - "\u0228\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02\u022B\u022C\x03\x02" + - "\x02\x02\u022B\u0229\x03\x02\x02\x02\u022C\u022E\x03\x02\x02\x02\u022D" + - "\u022B\x03\x02\x02\x02\u022E\u022F\x07,\x02\x02\u022F\u0230\x071\x02\x02" + - "\u0230\u0231\x03\x02\x02\x02\u0231\u0232\b\x16\n\x02\u02326\x03\x02\x02" + - "\x02\u0233\u0235\t\x04\x02\x02\u0234\u0233\x03\x02\x02\x02\u0235\u0236" + - "\x03\x02\x02\x02\u0236\u0234\x03\x02\x02\x02\u0236\u0237\x03\x02\x02\x02" + - "\u0237\u0238\x03\x02\x02\x02\u0238\u0239\b\x17\n\x02\u02398\x03\x02\x02" + - "\x02\u023A\u023B\x05\xA1L\x02\u023B\u023C\x03\x02\x02\x02\u023C\u023D" + - "\b\x18\v\x02\u023D\u023E\b\x18\f\x02\u023E:\x03\x02\x02\x02\u023F\u0240" + - "\x05C\x1D\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0242\b\x19\r\x02\u0242" + - "\u0243\b\x19\x0E\x02\u0243<\x03\x02\x02\x02\u0244\u0245\x057\x17\x02\u0245" + - "\u0246\x03\x02\x02\x02\u0246\u0247\b\x1A\n\x02\u0247>\x03\x02\x02\x02" + - "\u0248\u0249\x053\x15\x02\u0249\u024A\x03\x02\x02\x02\u024A\u024B\b\x1B" + - "\n\x02\u024B@\x03\x02\x02\x02\u024C\u024D\x055\x16\x02\u024D\u024E\x03" + - "\x02\x02\x02\u024E\u024F\b\x1C\n\x02\u024FB\x03\x02\x02\x02\u0250\u0251" + - "\x07~\x02\x02\u0251\u0252\x03\x02\x02\x02\u0252\u0253\b\x1D\x0E\x02\u0253" + - "D\x03\x02\x02\x02\u0254\u0255\t\x05\x02\x02\u0255F\x03\x02\x02\x02\u0256" + - "\u0257\t\x06\x02\x02\u0257H\x03\x02\x02\x02\u0258\u0259\x07^\x02\x02\u0259" + - "\u025A\t\x07\x02\x02\u025AJ\x03\x02\x02\x02\u025B\u025C\n\b\x02\x02\u025C" + - "L\x03\x02\x02\x02\u025D\u025F\t\t\x02\x02\u025E\u0260\t\n\x02\x02\u025F" + - "\u025E\x03\x02\x02\x02\u025F\u0260\x03\x02\x02\x02\u0260\u0262\x03\x02" + - "\x02\x02\u0261\u0263\x05E\x1E\x02\u0262\u0261\x03\x02\x02\x02\u0263\u0264" + - "\x03\x02\x02\x02\u0264\u0262\x03\x02\x02\x02\u0264\u0265\x03\x02\x02\x02" + - "\u0265N\x03\x02\x02\x02\u0266\u0267\x07B\x02\x02\u0267P\x03\x02\x02\x02" + - "\u0268\u0269\x07b\x02\x02\u0269R\x03\x02\x02\x02\u026A\u026E\n\v\x02\x02" + - "\u026B\u026C\x07b\x02\x02\u026C\u026E\x07b\x02\x02\u026D\u026A\x03\x02" + - "\x02\x02\u026D\u026B\x03\x02\x02\x02\u026ET\x03\x02\x02\x02\u026F\u0270" + - "\x07a\x02\x02\u0270V\x03\x02\x02\x02\u0271\u0275\x05G\x1F\x02\u0272\u0275" + - "\x05E\x1E\x02\u0273\u0275\x05U&\x02\u0274\u0271\x03\x02\x02\x02\u0274" + - "\u0272\x03\x02\x02\x02\u0274\u0273\x03\x02\x02\x02\u0275X\x03\x02\x02" + - "\x02\u0276\u027B\x07$\x02\x02\u0277\u027A\x05I \x02\u0278\u027A\x05K!" + - "\x02\u0279\u0277\x03\x02\x02\x02\u0279\u0278\x03\x02\x02\x02\u027A\u027D" + - "\x03\x02\x02\x02\u027B\u0279\x03\x02\x02\x02\u027B\u027C\x03\x02\x02\x02" + - "\u027C\u027E\x03\x02\x02\x02\u027D\u027B\x03\x02\x02\x02\u027E\u0294\x07" + - "$\x02\x02\u027F\u0280\x07$\x02\x02\u0280\u0281\x07$\x02\x02\u0281\u0282" + - "\x07$\x02\x02\u0282\u0286\x03\x02\x02\x02\u0283\u0285\n\x03\x02\x02\u0284" + - "\u0283\x03\x02\x02\x02\u0285\u0288\x03\x02\x02\x02\u0286\u0287\x03\x02" + - "\x02\x02\u0286\u0284\x03\x02\x02\x02\u0287\u0289\x03\x02\x02\x02\u0288" + - "\u0286\x03\x02\x02\x02\u0289\u028A\x07$\x02\x02\u028A\u028B\x07$\x02\x02" + - "\u028B\u028C\x07$\x02\x02\u028C\u028E\x03\x02\x02\x02\u028D\u028F\x07" + - "$\x02\x02\u028E\u028D\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F" + - "\u0291\x03\x02\x02\x02\u0290\u0292\x07$\x02\x02\u0291\u0290\x03\x02\x02" + - "\x02\u0291\u0292\x03\x02\x02\x02\u0292\u0294\x03\x02\x02\x02\u0293\u0276" + - "\x03\x02\x02\x02\u0293\u027F\x03\x02\x02\x02\u0294Z\x03\x02\x02\x02\u0295" + - "\u0297\x05E\x1E\x02\u0296\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02\x02" + - "\x02\u0298\u0296\x03\x02\x02\x02\u0298\u0299\x03\x02\x02\x02\u0299\\\x03" + - "\x02\x02\x02\u029A\u029C\x05E\x1E\x02\u029B\u029A\x03\x02\x02\x02\u029C" + - "\u029D\x03\x02\x02\x02\u029D\u029B\x03\x02\x02\x02\u029D\u029E\x03\x02" + - "\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F\u02A3\x05k1\x02\u02A0\u02A2" + - "\x05E\x1E\x02\u02A1\u02A0\x03\x02\x02\x02\u02A2\u02A5\x03\x02\x02\x02" + - "\u02A3\u02A1\x03\x02\x02\x02\u02A3\u02A4\x03\x02\x02\x02\u02A4\u02C5\x03" + - "\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A6\u02A8\x05k1\x02\u02A7\u02A9" + - "\x05E\x1E\x02\u02A8\u02A7\x03\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02" + - "\u02AA\u02A8\x03\x02\x02\x02\u02AA\u02AB\x03\x02\x02\x02\u02AB\u02C5\x03" + - "\x02\x02\x02\u02AC\u02AE\x05E\x1E\x02\u02AD\u02AC\x03\x02\x02\x02\u02AE" + - "\u02AF\x03\x02\x02\x02\u02AF\u02AD\x03\x02\x02\x02\u02AF\u02B0\x03\x02" + - "\x02\x02\u02B0\u02B8\x03\x02\x02\x02\u02B1\u02B5\x05k1\x02\u02B2\u02B4" + - "\x05E\x1E\x02\u02B3\u02B2\x03\x02\x02\x02\u02B4\u02B7\x03\x02\x02\x02" + - "\u02B5\u02B3\x03\x02\x02\x02\u02B5\u02B6\x03\x02\x02\x02\u02B6\u02B9\x03" + - "\x02\x02\x02\u02B7\u02B5\x03\x02\x02\x02\u02B8\u02B1\x03\x02\x02\x02\u02B8" + - "\u02B9\x03\x02\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BB\x05M\"" + - "\x02\u02BB\u02C5\x03\x02\x02\x02\u02BC\u02BE\x05k1\x02\u02BD\u02BF\x05" + - "E\x1E\x02\u02BE\u02BD\x03\x02\x02\x02\u02BF\u02C0\x03\x02\x02\x02\u02C0" + - "\u02BE\x03\x02\x02\x02\u02C0\u02C1\x03\x02\x02\x02\u02C1\u02C2\x03\x02" + - "\x02\x02\u02C2\u02C3\x05M\"\x02\u02C3\u02C5\x03\x02\x02\x02\u02C4\u029B" + - "\x03\x02\x02\x02\u02C4\u02A6\x03\x02\x02\x02\u02C4\u02AD\x03\x02\x02\x02" + - "\u02C4\u02BC\x03\x02\x02\x02\u02C5^\x03\x02\x02\x02\u02C6\u02C7\x05\u0141" + - "\x9C\x02\u02C7\u02C8\x05\u016F\xB3\x02\u02C8`\x03\x02\x02\x02\u02C9\u02CA" + - "\x05\u013F\x9B\x02\u02CA\u02CB\x05\u0159\xA8\x02\u02CB\u02CC\x05\u0145" + - "\x9E\x02\u02CCb\x03\x02\x02\x02\u02CD\u02CE\x05\u013F\x9B\x02\u02CE\u02CF" + - "\x05\u0163\xAD\x02\u02CF\u02D0\x05\u0143\x9D\x02\u02D0d\x03\x02\x02\x02" + - "\u02D1\u02D2\x07?\x02\x02\u02D2f\x03\x02\x02\x02\u02D3\u02D4\x07.\x02" + - "\x02\u02D4h\x03\x02\x02\x02\u02D5\u02D6\x05\u0145\x9E\x02\u02D6\u02D7" + - "\x05\u0147\x9F\x02\u02D7\u02D8\x05\u0163\xAD\x02\u02D8\u02D9\x05\u0143" + - "\x9D\x02\u02D9j\x03\x02\x02\x02\u02DA\u02DB\x070\x02\x02\u02DBl\x03\x02" + - "\x02\x02\u02DC\u02DD\x05\u0149\xA0\x02\u02DD\u02DE\x05\u013F\x9B\x02\u02DE" + - "\u02DF\x05\u0155\xA6\x02\u02DF\u02E0\x05\u0163\xAD\x02\u02E0\u02E1\x05" + - "\u0147\x9F\x02\u02E1n\x03\x02\x02\x02\u02E2\u02E3\x05\u0149\xA0\x02\u02E3" + - "\u02E4\x05\u014F\xA3\x02\u02E4\u02E5\x05\u0161\xAC\x02\u02E5\u02E6\x05" + - "\u0163\xAD\x02\u02E6\u02E7\x05\u0165\xAE\x02\u02E7p\x03\x02\x02\x02\u02E8" + - "\u02E9\x05\u0155\xA6\x02\u02E9\u02EA\x05\u013F\x9B\x02\u02EA\u02EB\x05" + - "\u0163\xAD\x02\u02EB\u02EC\x05\u0165\xAE\x02\u02ECr\x03\x02\x02\x02\u02ED" + - "\u02EE\x07*\x02\x02\u02EEt\x03\x02\x02\x02\u02EF\u02F0\x05\u014F\xA3\x02" + - "\u02F0\u02F1\x05\u0159\xA8\x02\u02F1v\x03\x02\x02\x02\u02F2\u02F3\x05" + - "\u014F\xA3\x02\u02F3\u02F4\x05\u0163\xAD\x02\u02F4x\x03\x02\x02\x02\u02F5" + - "\u02F6\x05\u0155\xA6\x02\u02F6\u02F7\x05\u014F\xA3\x02\u02F7\u02F8\x05" + - "\u0153\xA5\x02\u02F8\u02F9\x05\u0147\x9F\x02\u02F9z\x03\x02\x02\x02\u02FA" + - "\u02FB\x05\u0159\xA8\x02\u02FB\u02FC\x05\u015B\xA9\x02\u02FC\u02FD\x05" + - "\u0165\xAE\x02\u02FD|\x03\x02\x02\x02\u02FE\u02FF\x05\u0159\xA8\x02\u02FF" + - "\u0300\x05\u0167\xAF\x02\u0300\u0301\x05\u0155\xA6\x02\u0301\u0302\x05" + - "\u0155\xA6\x02\u0302~\x03\x02\x02\x02\u0303\u0304\x05\u0159\xA8\x02\u0304" + - "\u0305\x05\u0167\xAF\x02\u0305\u0306\x05\u0155\xA6\x02\u0306\u0307\x05" + - "\u0155\xA6\x02\u0307\u0308\x05\u0163\xAD\x02\u0308\x80\x03\x02\x02\x02" + - "\u0309\u030A\x05\u015B\xA9\x02\u030A\u030B\x05\u0161\xAC\x02\u030B\x82" + - "\x03\x02\x02\x02\u030C\u030D\x07A\x02\x02\u030D\x84\x03\x02\x02\x02\u030E" + - "\u030F\x05\u0161\xAC\x02\u030F\u0310\x05\u0155\xA6\x02\u0310\u0311\x05" + - "\u014F\xA3\x02\u0311\u0312\x05\u0153\xA5\x02\u0312\u0313\x05\u0147\x9F" + - "\x02\u0313\x86\x03\x02\x02\x02\u0314\u0315\x07+\x02\x02\u0315\x88\x03" + - "\x02\x02\x02\u0316\u0317\x05\u0165\xAE\x02\u0317\u0318\x05\u0161\xAC\x02" + - "\u0318\u0319\x05\u0167\xAF\x02\u0319\u031A\x05\u0147\x9F\x02\u031A\x8A" + - "\x03\x02\x02\x02\u031B\u031C\x07?\x02\x02\u031C\u031D\x07?\x02\x02\u031D" + - "\x8C\x03\x02\x02\x02\u031E\u031F\x07#\x02\x02\u031F\u0320\x07?\x02\x02" + - "\u0320\x8E\x03\x02\x02\x02\u0321\u0322\x07>\x02\x02\u0322\x90\x03\x02" + - "\x02\x02\u0323\u0324\x07>\x02\x02\u0324\u0325\x07?\x02\x02\u0325\x92\x03" + - "\x02\x02\x02\u0326\u0327\x07@\x02\x02\u0327\x94\x03\x02\x02\x02\u0328" + - "\u0329\x07@\x02\x02\u0329\u032A\x07?\x02\x02\u032A\x96\x03\x02\x02\x02" + - "\u032B\u032C\x07-\x02\x02\u032C\x98\x03\x02\x02\x02\u032D\u032E\x07/\x02" + - "\x02\u032E\x9A\x03\x02\x02\x02\u032F\u0330\x07,\x02\x02\u0330\x9C\x03" + - "\x02\x02\x02\u0331\u0332\x071\x02\x02\u0332\x9E\x03\x02\x02\x02\u0333" + - "\u0334\x07\'\x02\x02\u0334\xA0\x03\x02\x02\x02\u0335\u0336\x07]\x02\x02" + - "\u0336\u0337\x03\x02\x02\x02\u0337\u0338\bL\x02\x02\u0338\u0339\bL\x02" + - "\x02\u0339\xA2\x03\x02\x02\x02\u033A\u033B\x07_\x02\x02\u033B\u033C\x03" + - "\x02\x02\x02\u033C\u033D\bM\x0E\x02\u033D\u033E\bM\x0E\x02\u033E\xA4\x03" + - "\x02\x02\x02\u033F\u0343\x05G\x1F\x02\u0340\u0342\x05W\'\x02\u0341\u0340" + - "\x03\x02\x02\x02\u0342\u0345\x03\x02\x02\x02\u0343\u0341\x03\x02\x02\x02" + - "\u0343\u0344\x03\x02\x02\x02\u0344\u0350\x03\x02\x02\x02\u0345\u0343\x03" + - "\x02\x02\x02\u0346\u0349\x05U&\x02\u0347\u0349\x05O#\x02\u0348\u0346\x03" + - "\x02\x02\x02\u0348\u0347\x03\x02\x02\x02\u0349\u034B\x03\x02\x02\x02\u034A" + - "\u034C\x05W\'\x02\u034B\u034A\x03\x02\x02\x02\u034C\u034D\x03\x02\x02" + - "\x02\u034D\u034B\x03\x02\x02\x02\u034D\u034E\x03\x02\x02\x02\u034E\u0350" + - "\x03\x02\x02\x02\u034F\u033F\x03\x02\x02\x02\u034F\u0348\x03\x02\x02\x02" + - "\u0350\xA6\x03\x02\x02\x02\u0351\u0353\x05Q$\x02\u0352\u0354\x05S%\x02" + - "\u0353\u0352\x03\x02\x02\x02\u0354\u0355\x03\x02\x02\x02\u0355\u0353\x03" + - "\x02\x02\x02\u0355\u0356\x03\x02\x02\x02\u0356\u0357\x03\x02\x02\x02\u0357" + - "\u0358\x05Q$\x02\u0358\xA8\x03\x02\x02\x02\u0359\u035A\x053\x15\x02\u035A" + - "\u035B\x03\x02\x02\x02\u035B\u035C\bP\n\x02\u035C\xAA\x03\x02\x02\x02" + - "\u035D\u035E\x055\x16\x02\u035E\u035F\x03\x02\x02\x02\u035F\u0360\bQ\n" + - "\x02\u0360\xAC\x03\x02\x02\x02\u0361\u0362\x057\x17\x02\u0362\u0363\x03" + - "\x02\x02\x02\u0363\u0364\bR\n\x02\u0364\xAE\x03\x02\x02\x02\u0365\u0366" + - "\x05C\x1D\x02\u0366\u0367\x03\x02\x02\x02\u0367\u0368\bS\r\x02\u0368\u0369" + - "\bS\x0E\x02\u0369\xB0\x03\x02\x02\x02\u036A\u036B\x05\xA1L\x02\u036B\u036C" + - "\x03\x02\x02\x02\u036C\u036D\bT\v\x02\u036D\xB2\x03\x02\x02\x02\u036E" + - "\u036F\x05\xA3M\x02\u036F\u0370\x03\x02\x02\x02\u0370\u0371\bU\x0F\x02" + - "\u0371\xB4\x03\x02\x02\x02\u0372\u0373\x05g/\x02\u0373\u0374\x03\x02\x02" + - "\x02\u0374\u0375\bV\x10\x02\u0375\xB6\x03\x02\x02\x02\u0376\u0377\x05" + - "e.\x02\u0377\u0378\x03\x02\x02\x02\u0378\u0379\bW\x11\x02\u0379\xB8\x03" + - "\x02\x02\x02\u037A\u037B\x05\u0157\xA7\x02\u037B\u037C\x05\u0147\x9F\x02" + - "\u037C\u037D\x05\u0165\xAE\x02\u037D\u037E\x05\u013F\x9B\x02\u037E\u037F" + - "\x05\u0145\x9E\x02\u037F\u0380\x05\u013F\x9B\x02\u0380\u0381\x05\u0165" + - "\xAE\x02\u0381\u0382\x05\u013F\x9B\x02\u0382\xBA\x03\x02\x02\x02\u0383" + - "\u0387\n\f\x02\x02\u0384\u0385\x071\x02\x02\u0385\u0387\n\r\x02\x02\u0386" + - "\u0383\x03\x02\x02\x02\u0386\u0384\x03\x02\x02\x02\u0387\xBC\x03\x02\x02" + - "\x02\u0388\u038A\x05\xBBY\x02\u0389\u0388\x03\x02\x02\x02\u038A\u038B" + - "\x03\x02\x02\x02\u038B\u0389\x03\x02\x02\x02\u038B\u038C\x03\x02\x02\x02" + - "\u038C\xBE\x03\x02\x02\x02\u038D\u038E\x05\xA7O\x02\u038E\u038F\x03\x02" + - "\x02\x02\u038F\u0390\b[\x12\x02\u0390\xC0\x03\x02\x02\x02\u0391\u0392" + - "\x053\x15\x02\u0392\u0393\x03\x02\x02\x02\u0393\u0394\b\\\n\x02\u0394" + - "\xC2\x03\x02\x02\x02\u0395\u0396\x055\x16\x02\u0396\u0397\x03\x02\x02" + - "\x02\u0397\u0398\b]\n\x02\u0398\xC4\x03\x02\x02\x02\u0399\u039A\x057\x17" + - "\x02\u039A\u039B\x03\x02\x02\x02\u039B\u039C\b^\n\x02\u039C\xC6\x03\x02" + - "\x02\x02\u039D\u039E\x05C\x1D\x02\u039E\u039F\x03\x02\x02\x02\u039F\u03A0" + - "\b_\r\x02\u03A0\u03A1\b_\x0E\x02\u03A1\xC8\x03\x02\x02\x02\u03A2\u03A3" + - "\x05k1\x02\u03A3\u03A4\x03\x02\x02\x02\u03A4\u03A5\b`\x13\x02\u03A5\xCA" + - "\x03\x02\x02\x02\u03A6\u03A7\x05g/\x02\u03A7\u03A8\x03\x02\x02\x02\u03A8" + - "\u03A9\ba\x10\x02\u03A9\xCC\x03\x02\x02\x02\u03AA\u03AF\x05G\x1F\x02\u03AB" + - "\u03AF\x05E\x1E\x02\u03AC\u03AF\x05U&\x02\u03AD\u03AF\x05\x9BI\x02\u03AE" + - "\u03AA\x03\x02\x02\x02\u03AE\u03AB\x03\x02\x02\x02\u03AE\u03AC\x03\x02" + - "\x02\x02\u03AE\u03AD\x03\x02\x02\x02\u03AF\xCE\x03\x02\x02\x02\u03B0\u03B3" + - "\x05G\x1F\x02\u03B1\u03B3\x05\x9BI\x02\u03B2\u03B0\x03\x02\x02\x02\u03B2" + - "\u03B1\x03\x02\x02\x02\u03B3\u03B7\x03\x02\x02\x02\u03B4\u03B6\x05\xCD" + - "b\x02\u03B5\u03B4\x03\x02\x02\x02\u03B6\u03B9\x03\x02\x02\x02\u03B7\u03B5" + - "\x03\x02\x02\x02\u03B7\u03B8\x03\x02\x02\x02\u03B8\u03C4\x03\x02\x02\x02" + - "\u03B9\u03B7\x03\x02\x02\x02\u03BA\u03BD\x05U&\x02\u03BB\u03BD\x05O#\x02" + - "\u03BC\u03BA\x03\x02\x02\x02\u03BC\u03BB\x03\x02\x02\x02\u03BD\u03BF\x03" + - "\x02\x02\x02\u03BE\u03C0\x05\xCDb\x02\u03BF\u03BE\x03\x02\x02\x02\u03C0" + - "\u03C1\x03\x02\x02\x02\u03C1\u03BF\x03\x02\x02\x02\u03C1\u03C2\x03\x02" + - "\x02\x02\u03C2\u03C4\x03\x02\x02\x02\u03C3\u03B2\x03\x02\x02\x02\u03C3" + - "\u03BC\x03\x02\x02\x02\u03C4\xD0\x03\x02\x02\x02\u03C5\u03C6\x05\xCFc" + - "\x02\u03C6\u03C7\x03\x02\x02\x02\u03C7\u03C8\bd\x14\x02\u03C8\xD2\x03" + - "\x02\x02\x02\u03C9\u03CA\x05\xA7O\x02\u03CA\u03CB\x03\x02\x02\x02\u03CB" + - "\u03CC\be\x12\x02\u03CC\xD4\x03\x02\x02\x02\u03CD\u03CE\x053\x15\x02\u03CE" + - "\u03CF\x03\x02\x02\x02\u03CF\u03D0\bf\n\x02\u03D0\xD6\x03\x02\x02\x02" + - "\u03D1\u03D2\x055\x16\x02\u03D2\u03D3\x03\x02\x02\x02\u03D3\u03D4\bg\n" + - "\x02\u03D4\xD8\x03\x02\x02\x02\u03D5\u03D6\x057\x17\x02\u03D6\u03D7\x03" + - "\x02\x02\x02\u03D7\u03D8\bh\n\x02\u03D8\xDA\x03\x02\x02\x02\u03D9\u03DA" + - "\x05C\x1D\x02\u03DA\u03DB\x03\x02\x02\x02\u03DB\u03DC\bi\r\x02\u03DC\u03DD" + - "\bi\x0E\x02\u03DD\xDC\x03\x02\x02\x02\u03DE\u03DF\x05e.\x02\u03DF\u03E0" + - "\x03\x02\x02\x02\u03E0\u03E1\bj\x11\x02\u03E1\xDE\x03\x02\x02\x02\u03E2" + - "\u03E3\x05g/\x02\u03E3\u03E4\x03\x02\x02\x02\u03E4\u03E5\bk\x10\x02\u03E5" + - "\xE0\x03\x02\x02\x02\u03E6\u03E7\x05k1\x02\u03E7\u03E8\x03\x02\x02\x02" + - "\u03E8\u03E9\bl\x13\x02\u03E9\xE2\x03\x02\x02\x02\u03EA\u03EB\x05\u013F" + - "\x9B\x02\u03EB\u03EC\x05\u0163\xAD\x02\u03EC\xE4\x03\x02\x02\x02\u03ED" + - "\u03EE\x05\xA7O\x02\u03EE\u03EF\x03\x02\x02\x02\u03EF\u03F0\bn\x12\x02" + - "\u03F0\xE6\x03\x02\x02\x02\u03F1\u03F2\x05\xCFc\x02\u03F2\u03F3\x03\x02" + - "\x02\x02\u03F3\u03F4\bo\x14\x02\u03F4\xE8\x03\x02\x02\x02\u03F5\u03F6" + - "\x053\x15\x02\u03F6\u03F7\x03\x02\x02\x02\u03F7\u03F8\bp\n\x02\u03F8\xEA" + - "\x03\x02\x02\x02\u03F9\u03FA\x055\x16\x02\u03FA\u03FB\x03\x02\x02\x02" + - "\u03FB\u03FC\bq\n\x02\u03FC\xEC\x03\x02\x02\x02\u03FD\u03FE\x057\x17\x02" + - "\u03FE\u03FF\x03\x02\x02\x02\u03FF\u0400\br\n\x02\u0400\xEE\x03\x02\x02" + - "\x02\u0401\u0402\x05C\x1D\x02\u0402\u0403\x03\x02\x02\x02\u0403\u0404" + - "\bs\r\x02\u0404\u0405\bs\x0E\x02\u0405\xF0\x03\x02\x02\x02\u0406\u0407" + - "\x05\xA1L\x02\u0407\u0408\x03\x02\x02\x02\u0408\u0409\bt\v\x02\u0409\u040A" + - "\bt\x15\x02\u040A\xF2\x03\x02\x02\x02\u040B\u040C\x05\u015B\xA9\x02\u040C" + - "\u040D\x05\u0159\xA8\x02\u040D\u040E\x03\x02\x02\x02\u040E\u040F\bu\x16" + - "\x02\u040F\xF4\x03\x02\x02\x02\u0410\u0411\x05\u016B\xB1\x02\u0411\u0412" + - "\x05\u014F\xA3\x02\u0412\u0413\x05\u0165\xAE\x02\u0413\u0414\x05\u014D" + - "\xA2\x02\u0414\u0415\x03\x02\x02\x02\u0415\u0416\bv\x16\x02\u0416\xF6" + - "\x03\x02\x02\x02\u0417\u0418\n\x0E\x02\x02\u0418\xF8\x03\x02\x02\x02\u0419" + - "\u041C\x05G\x1F\x02\u041A\u041C\x05E\x1E\x02\u041B\u0419\x03\x02\x02\x02" + - "\u041B\u041A\x03\x02\x02\x02\u041C\u0420\x03\x02\x02\x02\u041D\u041F\x05" + - "\xF7w\x02\u041E\u041D\x03\x02\x02\x02\u041F\u0422\x03\x02\x02\x02\u0420" + - "\u041E\x03\x02\x02\x02\u0420\u0421\x03\x02\x02\x02\u0421\xFA\x03\x02\x02" + - "\x02\u0422\u0420\x03\x02\x02\x02\u0423\u0424\x05\xA7O\x02\u0424\u0425" + - "\x03\x02\x02\x02\u0425\u0426\by\x12\x02\u0426\xFC\x03\x02\x02\x02\u0427" + - "\u0428\x05\xF9x\x02\u0428\u0429\x03\x02\x02\x02\u0429\u042A\bz\x17\x02" + - "\u042A\xFE\x03\x02\x02\x02\u042B\u042C\x053\x15\x02\u042C\u042D\x03\x02" + - "\x02\x02\u042D\u042E\b{\n\x02\u042E\u0100\x03\x02\x02\x02\u042F\u0430" + - "\x055\x16\x02\u0430\u0431\x03\x02\x02\x02\u0431\u0432\b|\n\x02\u0432\u0102" + - "\x03\x02\x02\x02\u0433\u0434\x057\x17\x02\u0434\u0435\x03\x02\x02\x02" + - "\u0435\u0436\b}\n\x02\u0436\u0104\x03\x02\x02\x02\u0437\u0438\x05C\x1D" + - "\x02\u0438\u0439\x03\x02\x02\x02\u0439\u043A\b~\r\x02\u043A\u043B\b~\x0E" + - "\x02\u043B\u043C\b~\x0E\x02\u043C\u0106\x03\x02\x02\x02\u043D\u043E\x05" + - "e.\x02\u043E\u043F\x03\x02\x02\x02\u043F\u0440\b\x7F\x11\x02\u0440\u0108" + - "\x03\x02\x02\x02\u0441\u0442\x05g/\x02\u0442\u0443\x03\x02\x02\x02\u0443" + - "\u0444\b\x80\x10\x02\u0444\u010A\x03\x02\x02\x02\u0445\u0446\x05k1\x02" + - "\u0446\u0447\x03\x02\x02\x02\u0447\u0448\b\x81\x13\x02\u0448\u010C\x03" + - "\x02\x02\x02\u0449\u044A\x05\xF5v\x02\u044A\u044B\x03\x02\x02\x02\u044B" + - "\u044C\b\x82\x18\x02\u044C\u010E\x03\x02\x02\x02"; + "\u048D\x03\x02\x02\x02\u012F\u0497\x03\x02\x02\x02\u0131\u049B\x03\x02" + + "\x02\x02\u0133\u049F\x03\x02\x02\x02\u0135\u04A3\x03\x02\x02\x02\u0137" + + "\u04A8\x03\x02\x02\x02\u0139\u04AF\x03\x02\x02\x02\u013B\u04B3\x03\x02" + + "\x02\x02\u013D\u04B7\x03\x02\x02\x02\u013F\u04BB\x03\x02\x02\x02\u0141" + + "\u04BF\x03\x02\x02\x02\u0143\u04C1\x03\x02\x02\x02\u0145\u04C3\x03\x02" + + "\x02\x02\u0147\u04C5\x03\x02\x02\x02\u0149\u04C7\x03\x02\x02\x02\u014B" + + "\u04C9\x03\x02\x02\x02\u014D\u04CB\x03\x02\x02\x02\u014F\u04CD\x03\x02" + + "\x02\x02\u0151\u04CF\x03\x02\x02\x02\u0153\u04D1\x03\x02\x02\x02\u0155" + + "\u04D3\x03\x02\x02\x02\u0157\u04D5\x03\x02\x02\x02\u0159\u04D7\x03\x02" + + "\x02\x02\u015B\u04D9\x03\x02\x02\x02\u015D\u04DB\x03\x02\x02\x02\u015F" + + "\u04DD\x03\x02\x02\x02\u0161\u04DF\x03\x02\x02\x02\u0163\u04E1\x03\x02" + + "\x02\x02\u0165\u04E3\x03\x02\x02\x02\u0167\u04E5\x03\x02\x02\x02\u0169" + + "\u04E7\x03\x02\x02\x02\u016B\u04E9\x03\x02\x02\x02\u016D\u04EB\x03\x02" + + "\x02\x02\u016F\u04ED\x03\x02\x02\x02\u0171\u04EF\x03\x02\x02\x02\u0173" + + "\u04F1\x03\x02\x02\x02\u0175\u0176\x05\u0147\x9F\x02\u0176\u0177\x05\u0151" + + "\xA4\x02\u0177\u0178\x05\u0165\xAE\x02\u0178\u0179\x05\u0165\xAE\x02\u0179" + + "\u017A\x05\u0149\xA0\x02\u017A\u017B\x05\u0145\x9E\x02\u017B\u017C\x05" + + "\u0167\xAF\x02\u017C\u017D\x03\x02\x02\x02\u017D\u017E\b\x02\x02\x02\u017E" + + "\x0E\x03\x02\x02\x02\u017F\u0180\x05\u0147\x9F\x02\u0180\u0181\x05\u0163" + + "\xAD\x02\u0181\u0182\x05\u015D\xAA\x02\u0182\u0183\x05\u015F\xAB\x02\u0183" + + "\u0184\x03\x02\x02\x02\u0184\u0185\b\x03\x03\x02\u0185\x10\x03\x02\x02" + + "\x02\u0186\u0187\x05\u0149\xA0\x02\u0187\u0188\x05\u015B\xA9\x02\u0188" + + "\u0189\x05\u0163\xAD\x02\u0189\u018A\x05\u0151\xA4\x02\u018A\u018B\x05" + + "\u0145\x9E\x02\u018B\u018C\x05\u014F\xA3\x02\u018C\u018D\x03\x02\x02\x02" + + "\u018D\u018E\b\x04\x04\x02\u018E\x12\x03\x02\x02\x02\u018F\u0190\x05\u0149" + + "\xA0\x02\u0190\u0191\x05\u016B\xB1\x02\u0191\u0192\x05\u0141\x9C\x02\u0192" + + "\u0193\x05\u0157\xA7\x02\u0193\u0194\x03\x02\x02\x02\u0194\u0195\b\x05" + + "\x02\x02\u0195\x14\x03\x02\x02\x02\u0196\u0197\x05\u0149\xA0\x02\u0197" + + "\u0198\x05\u016F\xB3\x02\u0198\u0199\x05\u015F\xAB\x02\u0199\u019A\x05" + + "\u0157\xA7\x02\u019A\u019B\x05\u0141\x9C\x02\u019B\u019C\x05\u0151\xA4" + + "\x02\u019C\u019D\x05\u015B\xA9\x02\u019D\u019E\x03\x02\x02\x02\u019E\u019F" + + "\b\x06\x05\x02\u019F\x16\x03\x02\x02\x02\u01A0\u01A1\x05\u014B\xA1\x02" + + "\u01A1\u01A2\x05\u0163\xAD\x02\u01A2\u01A3\x05\u015D\xAA\x02\u01A3\u01A4" + + "\x05\u0159\xA8\x02\u01A4\u01A5\x03\x02\x02\x02\u01A5\u01A6\b\x07\x06\x02" + + "\u01A6\x18\x03\x02\x02\x02\u01A7\u01A8\x05\u014D\xA2\x02\u01A8\u01A9\x05" + + "\u0163\xAD\x02\u01A9\u01AA\x05\u015D\xAA\x02\u01AA\u01AB\x05\u0155\xA6" + + "\x02\u01AB\u01AC\x03\x02\x02\x02\u01AC\u01AD\b\b\x02\x02\u01AD\x1A\x03" + + "\x02\x02\x02\u01AE\u01AF\x05\u0151\xA4\x02\u01AF\u01B0\x05\u015B\xA9\x02" + + "\u01B0\u01B1\x05\u0157\xA7\x02\u01B1\u01B2\x05\u0151\xA4\x02\u01B2\u01B3" + + "\x05\u015B\xA9\x02\u01B3\u01B4\x05\u0149\xA0\x02\u01B4\u01B5\x05\u0165" + + "\xAE\x02\u01B5\u01B6\x05\u0167\xAF\x02\u01B6\u01B7\x05\u0141\x9C\x02\u01B7" + + "\u01B8\x05\u0167\xAF\x02\u01B8\u01B9\x05\u0165\xAE\x02\u01B9\u01BA\x03" + + "\x02\x02\x02\u01BA\u01BB\b\t\x02\x02\u01BB\x1C\x03\x02\x02\x02\u01BC\u01BD" + + "\x05\u0155\xA6\x02\u01BD\u01BE\x05\u0149\xA0\x02\u01BE\u01BF\x05\u0149" + + "\xA0\x02\u01BF\u01C0\x05\u015F\xAB\x02\u01C0\u01C1\x03\x02\x02\x02\u01C1" + + "\u01C2\b\n\x03\x02\u01C2\x1E\x03\x02\x02\x02\u01C3\u01C4\x05\u0157\xA7" + + "\x02\u01C4\u01C5\x05\u0151\xA4\x02\u01C5\u01C6\x05\u0159\xA8\x02\u01C6" + + "\u01C7\x05\u0151\xA4\x02\u01C7\u01C8\x05\u0167\xAF\x02\u01C8\u01C9\x03" + + "\x02\x02\x02\u01C9\u01CA\b\v\x02\x02\u01CA \x03\x02\x02\x02\u01CB\u01CC" + + "\x05\u0159\xA8\x02\u01CC\u01CD\x05\u016B\xB1\x02\u01CD\u01CE\x05U&\x02" + + "\u01CE\u01CF\x05\u0149\xA0\x02\u01CF\u01D0\x05\u016F\xB3\x02\u01D0\u01D1" + + "\x05\u015F\xAB\x02\u01D1\u01D2\x05\u0141\x9C\x02\u01D2\u01D3\x05\u015B" + + "\xA9\x02\u01D3\u01D4\x05\u0147\x9F\x02\u01D4\u01D5\x03\x02\x02\x02\u01D5" + + "\u01D6\b\f\x07\x02\u01D6\"\x03\x02\x02\x02\u01D7\u01D8\x05\u015F\xAB\x02" + + "\u01D8\u01D9\x05\u0163\xAD\x02\u01D9\u01DA\x05\u015D\xAA\x02\u01DA\u01DB" + + "\x05\u0153\xA5\x02\u01DB\u01DC\x05\u0149\xA0\x02\u01DC\u01DD\x05\u0145" + + "\x9E\x02\u01DD\u01DE\x05\u0167\xAF\x02\u01DE\u01DF\x03\x02\x02\x02\u01DF" + + "\u01E0\b\r\x03\x02\u01E0$\x03\x02\x02\x02\u01E1\u01E2\x05\u0163\xAD\x02" + + "\u01E2\u01E3\x05\u0149\xA0\x02\u01E3\u01E4\x05\u015B\xA9\x02\u01E4\u01E5" + + "\x05\u0141\x9C\x02\u01E5\u01E6\x05\u0159\xA8\x02\u01E6\u01E7\x05\u0149" + + "\xA0\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01E9\b\x0E\b\x02\u01E9&\x03" + + "\x02\x02\x02\u01EA\u01EB\x05\u0163\xAD\x02\u01EB\u01EC\x05\u015D\xAA\x02" + + "\u01EC\u01ED\x05\u016D\xB2\x02\u01ED\u01EE\x03\x02\x02\x02\u01EE\u01EF" + + "\b\x0F\x02\x02\u01EF(\x03\x02\x02\x02\u01F0\u01F1\x05\u0165\xAE\x02\u01F1" + + "\u01F2\x05\u014F\xA3\x02\u01F2\u01F3\x05\u015D\xAA\x02\u01F3\u01F4\x05" + + "\u016D\xB2\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\b\x10\t\x02\u01F6" + + "*\x03\x02\x02\x02\u01F7\u01F8\x05\u0165\xAE\x02\u01F8\u01F9\x05\u015D" + + "\xAA\x02\u01F9\u01FA\x05\u0163\xAD\x02\u01FA\u01FB\x05\u0167\xAF\x02\u01FB" + + "\u01FC\x03\x02\x02\x02\u01FC\u01FD\b\x11\x02\x02\u01FD,\x03\x02\x02\x02" + + "\u01FE\u01FF\x05\u0165\xAE\x02\u01FF\u0200\x05\u0167\xAF\x02\u0200\u0201" + + "\x05\u0141\x9C\x02\u0201\u0202\x05\u0167\xAF\x02\u0202\u0203\x05\u0165" + + "\xAE\x02\u0203\u0204\x03\x02\x02\x02\u0204\u0205\b\x12\x02\x02\u0205." + + "\x03\x02\x02\x02\u0206\u0207\x05\u016D\xB2\x02\u0207\u0208\x05\u014F\xA3" + + "\x02\u0208\u0209\x05\u0149\xA0\x02\u0209\u020A\x05\u0163\xAD\x02\u020A" + + "\u020B\x05\u0149\xA0\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020D\b\x13" + + "\x02\x02\u020D0\x03\x02\x02\x02\u020E\u0210\n\x02\x02\x02\u020F\u020E" + + "\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02" + + "\u0211\u0212\x03\x02\x02\x02\u0212\u0213\x03\x02\x02\x02\u0213\u0214\b" + + "\x14\x02\x02\u02142\x03\x02\x02\x02\u0215\u0216\x071\x02\x02\u0216\u0217" + + "\x071\x02\x02\u0217\u021B\x03\x02\x02\x02\u0218\u021A\n\x03\x02\x02\u0219" + + "\u0218\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B\u0219\x03\x02" + + "\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021F\x03\x02\x02\x02\u021D" + + "\u021B\x03\x02\x02\x02\u021E\u0220\x07\x0F\x02\x02\u021F\u021E\x03\x02" + + "\x02\x02\u021F\u0220\x03\x02\x02\x02\u0220\u0222\x03\x02\x02\x02\u0221" + + "\u0223\x07\f\x02\x02\u0222\u0221\x03\x02\x02\x02\u0222\u0223\x03\x02\x02" + + "\x02\u0223\u0224\x03\x02\x02\x02\u0224\u0225\b\x15\n\x02\u02254\x03\x02" + + "\x02\x02\u0226\u0227\x071\x02\x02\u0227\u0228\x07,\x02\x02\u0228\u022D" + + "\x03\x02\x02\x02\u0229\u022C\x055\x16\x02\u022A\u022C\v\x02\x02\x02\u022B" + + "\u0229\x03\x02\x02\x02\u022B\u022A\x03\x02\x02\x02\u022C\u022F\x03\x02" + + "\x02\x02\u022D\u022E\x03\x02\x02\x02\u022D\u022B\x03\x02\x02\x02\u022E" + + "\u0230\x03\x02\x02\x02\u022F\u022D\x03\x02\x02\x02\u0230\u0231\x07,\x02" + + "\x02\u0231\u0232\x071\x02\x02\u0232\u0233\x03\x02\x02\x02\u0233\u0234" + + "\b\x16\n\x02\u02346\x03\x02\x02\x02\u0235\u0237\t\x04\x02\x02\u0236\u0235" + + "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0236\x03\x02\x02\x02" + + "\u0238\u0239\x03\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\b" + + "\x17\n\x02\u023B8\x03\x02\x02\x02\u023C\u023D\x05\xA3M\x02\u023D\u023E" + + "\x03\x02\x02\x02\u023E\u023F\b\x18\v\x02\u023F\u0240\b\x18\f\x02\u0240" + + ":\x03\x02\x02\x02\u0241\u0242\x05C\x1D\x02\u0242\u0243\x03\x02\x02\x02" + + "\u0243\u0244\b\x19\r\x02\u0244\u0245\b\x19\x0E\x02\u0245<\x03\x02\x02" + + "\x02\u0246\u0247\x057\x17\x02\u0247\u0248\x03\x02\x02\x02\u0248\u0249" + + "\b\x1A\n\x02\u0249>\x03\x02\x02\x02\u024A\u024B\x053\x15\x02\u024B\u024C" + + "\x03\x02\x02\x02\u024C\u024D\b\x1B\n\x02\u024D@\x03\x02\x02\x02\u024E" + + "\u024F\x055\x16\x02\u024F\u0250\x03\x02\x02\x02\u0250\u0251\b\x1C\n\x02" + + "\u0251B\x03\x02\x02\x02\u0252\u0253\x07~\x02\x02\u0253\u0254\x03\x02\x02" + + "\x02\u0254\u0255\b\x1D\x0E\x02\u0255D\x03\x02\x02\x02\u0256\u0257\t\x05" + + "\x02\x02\u0257F\x03\x02\x02\x02\u0258\u0259\t\x06\x02\x02\u0259H\x03\x02" + + "\x02\x02\u025A\u025B\x07^\x02\x02\u025B\u025C\t\x07\x02\x02\u025CJ\x03" + + "\x02\x02\x02\u025D\u025E\n\b\x02\x02\u025EL\x03\x02\x02\x02\u025F\u0261" + + "\t\t\x02\x02\u0260\u0262\t\n\x02\x02\u0261\u0260\x03\x02\x02\x02\u0261" + + "\u0262\x03\x02\x02\x02\u0262\u0264\x03\x02\x02\x02\u0263\u0265\x05E\x1E" + + "\x02\u0264\u0263\x03\x02\x02\x02\u0265\u0266\x03\x02\x02\x02\u0266\u0264" + + "\x03\x02\x02\x02\u0266\u0267\x03\x02\x02\x02\u0267N\x03\x02\x02\x02\u0268" + + "\u0269\x07B\x02\x02\u0269P\x03\x02\x02\x02\u026A\u026B\x07b\x02\x02\u026B" + + "R\x03\x02\x02\x02\u026C\u0270\n\v\x02\x02\u026D\u026E\x07b\x02\x02\u026E" + + "\u0270\x07b\x02\x02\u026F\u026C\x03\x02\x02\x02\u026F\u026D\x03\x02\x02" + + "\x02\u0270T\x03\x02\x02\x02\u0271\u0272\x07a\x02\x02\u0272V\x03\x02\x02" + + "\x02\u0273\u0277\x05G\x1F\x02\u0274\u0277\x05E\x1E\x02\u0275\u0277\x05" + + "U&\x02\u0276\u0273\x03\x02\x02\x02\u0276\u0274\x03\x02\x02\x02\u0276\u0275" + + "\x03\x02\x02\x02\u0277X\x03\x02\x02\x02\u0278\u027D\x07$\x02\x02\u0279" + + "\u027C\x05I \x02\u027A\u027C\x05K!\x02\u027B\u0279\x03\x02\x02\x02\u027B" + + "\u027A\x03\x02\x02\x02\u027C\u027F\x03\x02\x02\x02\u027D\u027B\x03\x02" + + "\x02\x02\u027D\u027E\x03\x02\x02\x02\u027E\u0280\x03\x02\x02\x02\u027F" + + "\u027D\x03\x02\x02\x02\u0280\u0296\x07$\x02\x02\u0281\u0282\x07$\x02\x02" + + "\u0282\u0283\x07$\x02\x02\u0283\u0284\x07$\x02\x02\u0284\u0288\x03\x02" + + "\x02\x02\u0285\u0287\n\x03\x02\x02\u0286\u0285\x03\x02\x02\x02\u0287\u028A" + + "\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0288\u0286\x03\x02\x02\x02" + + "\u0289\u028B\x03\x02\x02\x02\u028A\u0288\x03\x02\x02\x02\u028B\u028C\x07" + + "$\x02\x02\u028C\u028D\x07$\x02\x02\u028D\u028E\x07$\x02\x02\u028E\u0290" + + "\x03\x02\x02\x02\u028F\u0291\x07$\x02\x02\u0290\u028F\x03\x02\x02\x02" + + "\u0290\u0291\x03\x02\x02\x02\u0291\u0293\x03\x02\x02\x02\u0292\u0294\x07" + + "$\x02\x02\u0293\u0292\x03\x02\x02\x02\u0293\u0294\x03\x02\x02\x02\u0294" + + "\u0296\x03\x02\x02\x02\u0295\u0278\x03\x02\x02\x02\u0295\u0281\x03\x02" + + "\x02\x02\u0296Z\x03\x02\x02\x02\u0297\u0299\x05E\x1E\x02\u0298\u0297\x03" + + "\x02\x02\x02\u0299\u029A\x03\x02\x02\x02\u029A\u0298\x03\x02\x02\x02\u029A" + + "\u029B\x03\x02\x02\x02\u029B\\\x03\x02\x02\x02\u029C\u029E\x05E\x1E\x02" + + "\u029D\u029C\x03\x02\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F\u029D\x03" + + "\x02\x02\x02\u029F\u02A0\x03\x02\x02\x02\u02A0\u02A1\x03\x02\x02\x02\u02A1" + + "\u02A5\x05k1\x02\u02A2\u02A4\x05E\x1E\x02\u02A3\u02A2\x03\x02\x02\x02" + + "\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03" + + "\x02\x02\x02\u02A6\u02C7\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8" + + "\u02AA\x05k1\x02\u02A9\u02AB\x05E\x1E\x02\u02AA\u02A9\x03\x02\x02\x02" + + "\u02AB\u02AC\x03\x02\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AD\x03" + + "\x02\x02\x02\u02AD\u02C7\x03\x02\x02\x02\u02AE\u02B0\x05E\x1E\x02\u02AF" + + "\u02AE\x03\x02\x02\x02\u02B0\u02B1\x03\x02\x02\x02\u02B1\u02AF\x03\x02" + + "\x02\x02\u02B1\u02B2\x03\x02\x02\x02\u02B2\u02BA\x03\x02\x02\x02\u02B3" + + "\u02B7\x05k1\x02\u02B4\u02B6\x05E\x1E\x02\u02B5\u02B4\x03\x02\x02\x02" + + "\u02B6\u02B9\x03\x02\x02\x02\u02B7\u02B5\x03\x02\x02\x02\u02B7\u02B8\x03" + + "\x02\x02\x02\u02B8\u02BB\x03\x02\x02\x02\u02B9\u02B7\x03\x02\x02\x02\u02BA" + + "\u02B3\x03\x02\x02\x02\u02BA\u02BB\x03\x02\x02\x02\u02BB\u02BC\x03\x02" + + "\x02\x02\u02BC\u02BD\x05M\"\x02\u02BD\u02C7\x03\x02\x02\x02\u02BE\u02C0" + + "\x05k1\x02\u02BF\u02C1\x05E\x1E\x02\u02C0\u02BF\x03\x02\x02\x02\u02C1" + + "\u02C2\x03\x02\x02\x02\u02C2\u02C0\x03\x02\x02\x02\u02C2\u02C3\x03\x02" + + "\x02\x02\u02C3\u02C4\x03\x02\x02\x02\u02C4\u02C5\x05M\"\x02\u02C5\u02C7" + + "\x03\x02\x02\x02\u02C6\u029D\x03\x02\x02\x02\u02C6\u02A8\x03\x02\x02\x02" + + "\u02C6\u02AF\x03\x02\x02\x02\u02C6\u02BE\x03\x02\x02\x02\u02C7^\x03\x02" + + "\x02\x02\u02C8\u02C9\x05\u0143\x9D\x02\u02C9\u02CA\x05\u0171\xB4\x02\u02CA" + + "`\x03\x02\x02\x02\u02CB\u02CC\x05\u0141\x9C\x02\u02CC\u02CD\x05\u015B" + + "\xA9\x02\u02CD\u02CE\x05\u0147\x9F\x02\u02CEb\x03\x02\x02\x02\u02CF\u02D0" + + "\x05\u0141\x9C\x02\u02D0\u02D1\x05\u0165\xAE\x02\u02D1\u02D2\x05\u0145" + + "\x9E\x02\u02D2d\x03\x02\x02\x02\u02D3\u02D4\x07?\x02\x02\u02D4f\x03\x02" + + "\x02\x02\u02D5\u02D6\x07.\x02\x02\u02D6h\x03\x02\x02\x02\u02D7\u02D8\x05" + + "\u0147\x9F\x02\u02D8\u02D9\x05\u0149\xA0\x02\u02D9\u02DA\x05\u0165\xAE" + + "\x02\u02DA\u02DB\x05\u0145\x9E\x02\u02DBj\x03\x02\x02\x02\u02DC\u02DD" + + "\x070\x02\x02\u02DDl\x03\x02\x02\x02\u02DE\u02DF\x05\u014B\xA1\x02\u02DF" + + "\u02E0\x05\u0141\x9C\x02\u02E0\u02E1\x05\u0157\xA7\x02\u02E1\u02E2\x05" + + "\u0165\xAE\x02\u02E2\u02E3\x05\u0149\xA0\x02\u02E3n\x03\x02\x02\x02\u02E4" + + "\u02E5\x05\u014B\xA1\x02\u02E5\u02E6\x05\u0151\xA4\x02\u02E6\u02E7\x05" + + "\u0163\xAD\x02\u02E7\u02E8\x05\u0165\xAE\x02\u02E8\u02E9\x05\u0167\xAF" + + "\x02\u02E9p\x03\x02\x02\x02\u02EA\u02EB\x05\u0157\xA7\x02\u02EB\u02EC" + + "\x05\u0141\x9C\x02\u02EC\u02ED\x05\u0165\xAE\x02\u02ED\u02EE\x05\u0167" + + "\xAF\x02\u02EEr\x03\x02\x02\x02\u02EF\u02F0\x07*\x02\x02\u02F0t\x03\x02" + + "\x02\x02\u02F1\u02F2\x05\u0151\xA4\x02\u02F2\u02F3\x05\u015B\xA9\x02\u02F3" + + "v\x03\x02\x02\x02\u02F4\u02F5\x05\u0151\xA4\x02\u02F5\u02F6\x05\u0165" + + "\xAE\x02\u02F6x\x03\x02\x02\x02\u02F7\u02F8\x05\u0157\xA7\x02\u02F8\u02F9" + + "\x05\u0151\xA4\x02\u02F9\u02FA\x05\u0155\xA6\x02\u02FA\u02FB\x05\u0149" + + "\xA0\x02\u02FBz\x03\x02\x02\x02\u02FC\u02FD\x05\u015B\xA9\x02\u02FD\u02FE" + + "\x05\u015D\xAA\x02\u02FE\u02FF\x05\u0167\xAF\x02\u02FF|\x03\x02\x02\x02" + + "\u0300\u0301\x05\u015B\xA9\x02\u0301\u0302\x05\u0169\xB0\x02\u0302\u0303" + + "\x05\u0157\xA7\x02\u0303\u0304\x05\u0157\xA7\x02\u0304~\x03\x02\x02\x02" + + "\u0305\u0306\x05\u015B\xA9\x02\u0306\u0307\x05\u0169\xB0\x02\u0307\u0308" + + "\x05\u0157\xA7\x02\u0308\u0309\x05\u0157\xA7\x02\u0309\u030A\x05\u0165" + + "\xAE\x02\u030A\x80\x03\x02\x02\x02\u030B\u030C\x05\u015D\xAA\x02\u030C" + + "\u030D\x05\u0163\xAD\x02\u030D\x82\x03\x02\x02\x02\u030E\u030F\x07A\x02" + + "\x02\u030F\x84\x03\x02\x02\x02\u0310\u0311\x05\u0163\xAD\x02\u0311\u0312" + + "\x05\u0157\xA7\x02\u0312\u0313\x05\u0151\xA4\x02\u0313\u0314\x05\u0155" + + "\xA6\x02\u0314\u0315\x05\u0149\xA0\x02\u0315\x86\x03\x02\x02\x02\u0316" + + "\u0317\x07+\x02\x02\u0317\x88\x03\x02\x02\x02\u0318\u0319\x05\u0167\xAF" + + "\x02\u0319\u031A\x05\u0163\xAD\x02\u031A\u031B\x05\u0169\xB0\x02\u031B" + + "\u031C\x05\u0149\xA0\x02\u031C\x8A\x03\x02\x02\x02\u031D\u031E\x07?\x02" + + "\x02\u031E\u031F\x07?\x02\x02\u031F\x8C\x03\x02\x02\x02\u0320\u0321\x07" + + "?\x02\x02\u0321\u0322\x07\x80\x02\x02\u0322\x8E\x03\x02\x02\x02\u0323" + + "\u0324\x07#\x02\x02\u0324\u0325\x07?\x02\x02\u0325\x90\x03\x02\x02\x02" + + "\u0326\u0327\x07>\x02\x02\u0327\x92\x03\x02\x02\x02\u0328\u0329\x07>\x02" + + "\x02\u0329\u032A\x07?\x02\x02\u032A\x94\x03\x02\x02\x02\u032B\u032C\x07" + + "@\x02\x02\u032C\x96\x03\x02\x02\x02\u032D\u032E\x07@\x02\x02\u032E\u032F" + + "\x07?\x02\x02\u032F\x98\x03\x02\x02\x02\u0330\u0331\x07-\x02\x02\u0331" + + "\x9A\x03\x02\x02\x02\u0332\u0333\x07/\x02\x02\u0333\x9C\x03\x02\x02\x02" + + "\u0334\u0335\x07,\x02\x02\u0335\x9E\x03\x02\x02\x02\u0336\u0337\x071\x02" + + "\x02\u0337\xA0\x03\x02\x02\x02\u0338\u0339\x07\'\x02\x02\u0339\xA2\x03" + + "\x02\x02\x02\u033A\u033B\x07]\x02\x02\u033B\u033C\x03\x02\x02\x02\u033C" + + "\u033D\bM\x02\x02\u033D\u033E\bM\x02\x02\u033E\xA4\x03\x02\x02\x02\u033F" + + "\u0340\x07_\x02\x02\u0340\u0341\x03\x02\x02\x02\u0341\u0342\bN\x0E\x02" + + "\u0342\u0343\bN\x0E\x02\u0343\xA6\x03\x02\x02\x02\u0344\u0348\x05G\x1F" + + "\x02\u0345\u0347\x05W\'\x02\u0346\u0345\x03\x02\x02\x02\u0347\u034A\x03" + + "\x02\x02\x02\u0348\u0346\x03\x02\x02\x02\u0348\u0349\x03\x02\x02\x02\u0349" + + "\u0355\x03\x02\x02\x02\u034A\u0348\x03\x02\x02\x02\u034B\u034E\x05U&\x02" + + "\u034C\u034E\x05O#\x02\u034D\u034B\x03\x02\x02\x02\u034D\u034C\x03\x02" + + "\x02\x02\u034E\u0350\x03\x02\x02\x02\u034F\u0351\x05W\'\x02\u0350\u034F" + + "\x03\x02\x02\x02\u0351\u0352\x03\x02\x02\x02\u0352\u0350\x03\x02\x02\x02" + + "\u0352\u0353\x03\x02\x02\x02\u0353\u0355\x03\x02\x02\x02\u0354\u0344\x03" + + "\x02\x02\x02\u0354\u034D\x03\x02\x02\x02\u0355\xA8\x03\x02\x02\x02\u0356" + + "\u0358\x05Q$\x02\u0357\u0359\x05S%\x02\u0358\u0357\x03\x02\x02\x02\u0359" + + "\u035A\x03\x02\x02\x02\u035A\u0358\x03\x02\x02\x02\u035A\u035B\x03\x02" + + "\x02\x02\u035B\u035C\x03\x02\x02\x02\u035C\u035D\x05Q$\x02\u035D\xAA\x03" + + "\x02\x02\x02\u035E\u035F\x053\x15\x02\u035F\u0360\x03\x02\x02\x02\u0360" + + "\u0361\bQ\n\x02\u0361\xAC\x03\x02\x02\x02\u0362\u0363\x055\x16\x02\u0363" + + "\u0364\x03\x02\x02\x02\u0364\u0365\bR\n\x02\u0365\xAE\x03\x02\x02\x02" + + "\u0366\u0367\x057\x17\x02\u0367\u0368\x03\x02\x02\x02\u0368\u0369\bS\n" + + "\x02\u0369\xB0\x03\x02\x02\x02\u036A\u036B\x05C\x1D\x02\u036B\u036C\x03" + + "\x02\x02\x02\u036C\u036D\bT\r\x02\u036D\u036E\bT\x0E\x02\u036E\xB2\x03" + + "\x02\x02\x02\u036F\u0370\x05\xA3M\x02\u0370\u0371\x03\x02\x02\x02\u0371" + + "\u0372\bU\v\x02\u0372\xB4\x03\x02\x02\x02\u0373\u0374\x05\xA5N\x02\u0374" + + "\u0375\x03\x02\x02\x02\u0375\u0376\bV\x0F\x02\u0376\xB6\x03\x02\x02\x02" + + "\u0377\u0378\x05g/\x02\u0378\u0379\x03\x02\x02\x02\u0379\u037A\bW\x10" + + "\x02\u037A\xB8\x03\x02\x02\x02\u037B\u037C\x05e.\x02\u037C\u037D\x03\x02" + + "\x02\x02\u037D\u037E\bX\x11\x02\u037E\xBA\x03\x02\x02\x02\u037F\u0380" + + "\x05\u0159\xA8\x02\u0380\u0381\x05\u0149\xA0\x02\u0381\u0382\x05\u0167" + + "\xAF\x02\u0382\u0383\x05\u0141\x9C\x02\u0383\u0384\x05\u0147\x9F\x02\u0384" + + "\u0385\x05\u0141\x9C\x02\u0385\u0386\x05\u0167\xAF\x02\u0386\u0387\x05" + + "\u0141\x9C\x02\u0387\xBC\x03\x02\x02\x02\u0388\u038C\n\f\x02\x02\u0389" + + "\u038A\x071\x02\x02\u038A\u038C\n\r\x02\x02\u038B\u0388\x03\x02\x02\x02" + + "\u038B\u0389\x03\x02\x02\x02\u038C\xBE\x03\x02\x02\x02\u038D\u038F\x05" + + "\xBDZ\x02\u038E\u038D\x03\x02\x02\x02\u038F\u0390\x03\x02\x02\x02\u0390" + + "\u038E\x03\x02\x02\x02\u0390\u0391\x03\x02\x02\x02\u0391\xC0\x03\x02\x02" + + "\x02\u0392\u0393\x05\xA9P\x02\u0393\u0394\x03\x02\x02\x02\u0394\u0395" + + "\b\\\x12\x02\u0395\xC2\x03\x02\x02\x02\u0396\u0397\x053\x15\x02\u0397" + + "\u0398\x03\x02\x02\x02\u0398\u0399\b]\n\x02\u0399\xC4\x03\x02\x02\x02" + + "\u039A\u039B\x055\x16\x02\u039B\u039C\x03\x02\x02\x02\u039C\u039D\b^\n" + + "\x02\u039D\xC6\x03\x02\x02\x02\u039E\u039F\x057\x17\x02\u039F\u03A0\x03" + + "\x02\x02\x02\u03A0\u03A1\b_\n\x02\u03A1\xC8\x03\x02\x02\x02\u03A2\u03A3" + + "\x05C\x1D\x02\u03A3\u03A4\x03\x02\x02\x02\u03A4\u03A5\b`\r\x02\u03A5\u03A6" + + "\b`\x0E\x02\u03A6\xCA\x03\x02\x02\x02\u03A7\u03A8\x05k1\x02\u03A8\u03A9" + + "\x03\x02\x02\x02\u03A9\u03AA\ba\x13\x02\u03AA\xCC\x03\x02\x02\x02\u03AB" + + "\u03AC\x05g/\x02\u03AC\u03AD\x03\x02\x02\x02\u03AD\u03AE\bb\x10\x02\u03AE" + + "\xCE\x03\x02\x02\x02\u03AF\u03B4\x05G\x1F\x02\u03B0\u03B4\x05E\x1E\x02" + + "\u03B1\u03B4\x05U&\x02\u03B2\u03B4\x05\x9DJ\x02\u03B3\u03AF\x03\x02\x02" + + "\x02\u03B3\u03B0\x03\x02\x02\x02\u03B3\u03B1\x03\x02\x02\x02\u03B3\u03B2" + + "\x03\x02\x02\x02\u03B4\xD0\x03\x02\x02\x02\u03B5\u03B8\x05G\x1F\x02\u03B6" + + "\u03B8\x05\x9DJ\x02\u03B7\u03B5\x03\x02\x02\x02\u03B7\u03B6\x03\x02\x02" + + "\x02\u03B8\u03BC\x03\x02\x02\x02\u03B9\u03BB\x05\xCFc\x02\u03BA\u03B9" + + "\x03\x02\x02\x02\u03BB\u03BE\x03\x02\x02\x02\u03BC\u03BA\x03\x02\x02\x02" + + "\u03BC\u03BD\x03\x02\x02\x02\u03BD\u03C9\x03\x02\x02\x02\u03BE\u03BC\x03" + + "\x02\x02\x02\u03BF\u03C2\x05U&\x02\u03C0\u03C2\x05O#\x02\u03C1\u03BF\x03" + + "\x02\x02\x02\u03C1\u03C0\x03\x02\x02\x02\u03C2\u03C4\x03\x02\x02\x02\u03C3" + + "\u03C5\x05\xCFc\x02\u03C4\u03C3\x03\x02\x02\x02\u03C5\u03C6\x03\x02\x02" + + "\x02\u03C6\u03C4\x03\x02\x02\x02\u03C6\u03C7\x03\x02\x02\x02\u03C7\u03C9" + + "\x03\x02\x02\x02\u03C8\u03B7\x03\x02\x02\x02\u03C8\u03C1\x03\x02\x02\x02" + + "\u03C9\xD2\x03\x02\x02\x02\u03CA\u03CB\x05\xD1d\x02\u03CB\u03CC\x03\x02" + + "\x02\x02\u03CC\u03CD\be\x14\x02\u03CD\xD4\x03\x02\x02\x02\u03CE\u03CF" + + "\x05\xA9P\x02\u03CF\u03D0\x03\x02\x02\x02\u03D0\u03D1\bf\x12\x02\u03D1" + + "\xD6\x03\x02\x02\x02\u03D2\u03D3\x053\x15\x02\u03D3\u03D4\x03\x02\x02" + + "\x02\u03D4\u03D5\bg\n\x02\u03D5\xD8\x03\x02\x02\x02\u03D6\u03D7\x055\x16" + + "\x02\u03D7\u03D8\x03\x02\x02\x02\u03D8\u03D9\bh\n\x02\u03D9\xDA\x03\x02" + + "\x02\x02\u03DA\u03DB\x057\x17\x02\u03DB\u03DC\x03\x02\x02\x02\u03DC\u03DD" + + "\bi\n\x02\u03DD\xDC\x03\x02\x02\x02\u03DE\u03DF\x05C\x1D\x02\u03DF\u03E0" + + "\x03\x02\x02\x02\u03E0\u03E1\bj\r\x02\u03E1\u03E2\bj\x0E\x02\u03E2\xDE" + + "\x03\x02\x02\x02\u03E3\u03E4\x05e.\x02\u03E4\u03E5\x03\x02\x02\x02\u03E5" + + "\u03E6\bk\x11\x02\u03E6\xE0\x03\x02\x02\x02\u03E7\u03E8\x05g/\x02\u03E8" + + "\u03E9\x03\x02\x02\x02\u03E9\u03EA\bl\x10\x02\u03EA\xE2\x03\x02\x02\x02" + + "\u03EB\u03EC\x05k1\x02\u03EC\u03ED\x03\x02\x02\x02\u03ED\u03EE\bm\x13" + + "\x02\u03EE\xE4\x03\x02\x02\x02\u03EF\u03F0\x05\u0141\x9C\x02\u03F0\u03F1" + + "\x05\u0165\xAE\x02\u03F1\xE6\x03\x02\x02\x02\u03F2\u03F3\x05\xA9P\x02" + + "\u03F3\u03F4\x03\x02\x02\x02\u03F4\u03F5\bo\x12\x02\u03F5\xE8\x03\x02" + + "\x02\x02\u03F6\u03F7\x05\xD1d\x02\u03F7\u03F8\x03\x02\x02\x02\u03F8\u03F9" + + "\bp\x14\x02\u03F9\xEA\x03\x02\x02\x02\u03FA\u03FB\x053\x15\x02\u03FB\u03FC" + + "\x03\x02\x02\x02\u03FC\u03FD\bq\n\x02\u03FD\xEC\x03\x02\x02\x02\u03FE" + + "\u03FF\x055\x16\x02\u03FF\u0400\x03\x02\x02\x02\u0400\u0401\br\n\x02\u0401" + + "\xEE\x03\x02\x02\x02\u0402\u0403\x057\x17\x02\u0403\u0404\x03\x02\x02" + + "\x02\u0404\u0405\bs\n\x02\u0405\xF0\x03\x02\x02\x02\u0406\u0407\x05C\x1D" + + "\x02\u0407\u0408\x03\x02\x02\x02\u0408\u0409\bt\r\x02\u0409\u040A\bt\x0E" + + "\x02\u040A\xF2\x03\x02\x02\x02\u040B\u040C\x05\xA3M\x02\u040C\u040D\x03" + + "\x02\x02\x02\u040D\u040E\bu\v\x02\u040E\u040F\bu\x15\x02\u040F\xF4\x03" + + "\x02\x02\x02\u0410\u0411\x05\u015D\xAA\x02\u0411\u0412\x05\u015B\xA9\x02" + + "\u0412\u0413\x03\x02\x02\x02\u0413\u0414\bv\x16\x02\u0414\xF6\x03\x02" + + "\x02\x02\u0415\u0416\x05\u016D\xB2\x02\u0416\u0417\x05\u0151\xA4\x02\u0417" + + "\u0418\x05\u0167\xAF\x02\u0418\u0419\x05\u014F\xA3\x02\u0419\u041A\x03" + + "\x02\x02\x02\u041A\u041B\bw\x16\x02\u041B\xF8\x03\x02\x02\x02\u041C\u041D" + + "\n\x0E\x02\x02\u041D\xFA\x03\x02\x02\x02\u041E\u0421\x05G\x1F\x02\u041F" + + "\u0421\x05E\x1E\x02\u0420\u041E\x03\x02\x02\x02\u0420\u041F\x03\x02\x02" + + "\x02\u0421\u0425\x03\x02\x02\x02\u0422\u0424\x05\xF9x\x02\u0423\u0422" + + "\x03\x02\x02\x02\u0424\u0427\x03\x02\x02\x02\u0425\u0423\x03\x02\x02\x02" + + "\u0425\u0426\x03\x02\x02\x02\u0426\xFC\x03\x02\x02\x02\u0427\u0425\x03" + + "\x02\x02\x02\u0428\u0429\x05\xA9P\x02\u0429\u042A\x03\x02\x02\x02\u042A" + + "\u042B\bz\x12\x02\u042B\xFE\x03\x02\x02\x02\u042C\u042D\x05\xFBy\x02\u042D" + + "\u042E\x03\x02\x02\x02\u042E\u042F\b{\x17\x02\u042F\u0100\x03\x02\x02" + + "\x02\u0430\u0431\x053\x15\x02\u0431\u0432\x03\x02\x02\x02\u0432\u0433" + + "\b|\n\x02\u0433\u0102\x03\x02\x02\x02\u0434\u0435\x055\x16\x02\u0435\u0436" + + "\x03\x02\x02\x02\u0436\u0437\b}\n\x02\u0437\u0104\x03\x02\x02\x02\u0438" + + "\u0439\x057\x17\x02\u0439\u043A\x03\x02\x02\x02\u043A\u043B\b~\n\x02\u043B" + + "\u0106\x03\x02\x02\x02\u043C\u043D\x05C\x1D\x02\u043D\u043E\x03\x02\x02" + + "\x02\u043E\u043F\b\x7F\r\x02\u043F\u0440\b\x7F\x0E\x02\u0440\u0441\b\x7F" + + "\x0E\x02\u0441\u0108\x03\x02\x02\x02\u0442\u0443\x05e.\x02\u0443\u0444" + + "\x03\x02\x02\x02\u0444\u0445\b\x80\x11\x02\u0445\u010A\x03\x02\x02\x02" + + "\u0446\u0447\x05g/\x02\u0447\u0448\x03\x02\x02\x02\u0448\u0449\b\x81\x10" + + "\x02\u0449\u010C\x03\x02\x02\x02\u044A\u044B\x05k1"; private static readonly _serializedATNSegment2: string = - "\u044D\u044E\x05\xCFc\x02\u044E\u044F\x03\x02\x02\x02\u044F\u0450\b\x83" + - "\x14\x02\u0450\u0110\x03\x02\x02\x02\u0451\u0452\x05\xA7O\x02\u0452\u0453" + - "\x03\x02\x02\x02\u0453\u0454\b\x84\x12\x02\u0454\u0112\x03\x02\x02\x02" + - "\u0455\u0456\x053\x15\x02\u0456\u0457\x03\x02\x02\x02\u0457\u0458\b\x85" + - "\n\x02\u0458\u0114\x03\x02\x02\x02\u0459\u045A\x055\x16\x02\u045A\u045B" + - "\x03\x02\x02\x02\u045B\u045C\b\x86\n\x02\u045C\u0116\x03\x02\x02\x02\u045D" + - "\u045E\x057\x17\x02\u045E\u045F\x03\x02\x02\x02\u045F\u0460\b\x87\n\x02" + - "\u0460\u0118\x03\x02\x02\x02\u0461\u0462\x05C\x1D\x02\u0462\u0463\x03" + - "\x02\x02\x02\u0463\u0464\b\x88\r\x02\u0464\u0465\b\x88\x0E\x02\u0465\u011A" + - "\x03\x02\x02\x02\u0466\u0467\x05k1\x02\u0467\u0468\x03\x02\x02\x02\u0468" + - "\u0469\b\x89\x13\x02\u0469\u011C\x03\x02\x02\x02\u046A\u046B\x05\xA7O" + - "\x02\u046B\u046C\x03\x02\x02\x02\u046C\u046D\b\x8A\x12\x02\u046D\u011E" + - "\x03\x02\x02\x02\u046E\u046F\x05\xA5N\x02\u046F\u0470\x03\x02\x02\x02" + - "\u0470\u0471\b\x8B\x19\x02\u0471\u0120\x03\x02\x02\x02\u0472\u0473\x05" + - "3\x15\x02\u0473\u0474\x03\x02\x02\x02\u0474\u0475\b\x8C\n\x02\u0475\u0122" + - "\x03\x02\x02\x02\u0476\u0477\x055\x16\x02\u0477\u0478\x03\x02\x02\x02" + - "\u0478\u0479\b\x8D\n\x02\u0479\u0124\x03\x02\x02\x02\u047A\u047B\x057" + - "\x17\x02\u047B\u047C\x03\x02\x02\x02\u047C\u047D\b\x8E\n\x02\u047D\u0126" + - "\x03\x02\x02\x02\u047E\u047F\x05C\x1D\x02\u047F\u0480\x03\x02\x02\x02" + - "\u0480\u0481\b\x8F\r\x02\u0481\u0482\b\x8F\x0E\x02\u0482\u0128\x03\x02" + - "\x02\x02\u0483\u0484\x05\u014F\xA3\x02\u0484\u0485\x05\u0159\xA8\x02\u0485" + - "\u0486\x05\u0149\xA0\x02\u0486\u0487\x05\u015B\xA9\x02\u0487\u012A\x03" + - "\x02\x02\x02\u0488\u0489\x05\u0149\xA0\x02\u0489\u048A\x05\u0167\xAF\x02" + - "\u048A\u048B\x05\u0159\xA8\x02\u048B\u048C\x05\u0143\x9D\x02\u048C\u048D" + - "\x05\u0165\xAE\x02\u048D\u048E\x05\u014F\xA3\x02\u048E\u048F\x05\u015B" + - "\xA9\x02\u048F\u0490\x05\u0159\xA8\x02\u0490\u0491\x05\u0163\xAD\x02\u0491" + - "\u012C\x03\x02\x02\x02\u0492\u0493\x053\x15\x02\u0493\u0494\x03\x02\x02" + - "\x02\u0494\u0495\b\x92\n\x02\u0495\u012E\x03\x02\x02\x02\u0496\u0497\x05" + - "5\x16\x02\u0497\u0498\x03\x02\x02\x02\u0498\u0499\b\x93\n\x02\u0499\u0130" + - "\x03\x02\x02\x02\u049A\u049B\x057\x17\x02\u049B\u049C\x03\x02\x02\x02" + - "\u049C\u049D\b\x94\n\x02\u049D\u0132\x03\x02\x02\x02\u049E\u049F\x05\xA3" + - "M\x02\u049F\u04A0\x03\x02\x02\x02\u04A0\u04A1\b\x95\x0F\x02\u04A1\u04A2" + - "\b\x95\x0E\x02\u04A2\u0134\x03\x02\x02\x02\u04A3\u04A4\x07<\x02\x02\u04A4" + - "\u0136\x03\x02\x02\x02\u04A5\u04AB\x05O#\x02\u04A6\u04AB\x05E\x1E\x02" + - "\u04A7\u04AB\x05k1\x02\u04A8\u04AB\x05G\x1F\x02\u04A9\u04AB\x05U&\x02" + - "\u04AA\u04A5\x03\x02\x02\x02\u04AA\u04A6\x03\x02\x02\x02\u04AA\u04A7\x03" + - "\x02\x02\x02\u04AA\u04A8\x03\x02\x02\x02\u04AA\u04A9\x03\x02\x02\x02\u04AB" + - "\u04AC\x03\x02\x02\x02\u04AC\u04AA\x03\x02\x02\x02\u04AC\u04AD\x03\x02" + - "\x02\x02\u04AD\u0138\x03\x02\x02\x02\u04AE\u04AF\x053\x15\x02\u04AF\u04B0" + - "\x03\x02\x02\x02\u04B0\u04B1\b\x98\n\x02\u04B1\u013A\x03\x02\x02\x02\u04B2" + - "\u04B3\x055\x16\x02\u04B3\u04B4\x03\x02\x02\x02\u04B4\u04B5\b\x99\n\x02" + - "\u04B5\u013C\x03\x02\x02\x02\u04B6\u04B7\x057\x17\x02\u04B7\u04B8\x03" + - "\x02\x02\x02\u04B8\u04B9\b\x9A\n\x02\u04B9\u013E\x03\x02\x02\x02\u04BA" + - "\u04BB\t\x0F\x02\x02\u04BB\u0140\x03\x02\x02\x02\u04BC\u04BD\t\x10\x02" + - "\x02\u04BD\u0142\x03\x02\x02\x02\u04BE\u04BF\t\x11\x02\x02\u04BF\u0144" + - "\x03\x02\x02\x02\u04C0\u04C1\t\x12\x02\x02\u04C1\u0146\x03\x02\x02\x02" + - "\u04C2\u04C3\t\t\x02\x02\u04C3\u0148\x03\x02\x02\x02\u04C4\u04C5\t\x13" + - "\x02\x02\u04C5\u014A\x03\x02\x02\x02\u04C6\u04C7\t\x14\x02\x02\u04C7\u014C" + - "\x03\x02\x02\x02\u04C8\u04C9\t\x15\x02\x02\u04C9\u014E\x03\x02\x02\x02" + - "\u04CA\u04CB\t\x16\x02\x02\u04CB\u0150\x03\x02\x02\x02\u04CC\u04CD\t\x17" + - "\x02\x02\u04CD\u0152\x03\x02\x02\x02\u04CE\u04CF\t\x18\x02\x02\u04CF\u0154" + - "\x03\x02\x02\x02\u04D0\u04D1\t\x19\x02\x02\u04D1\u0156\x03\x02\x02\x02" + - "\u04D2\u04D3\t\x1A\x02\x02\u04D3\u0158\x03\x02\x02\x02\u04D4\u04D5\t\x1B" + - "\x02\x02\u04D5\u015A\x03\x02\x02\x02\u04D6\u04D7\t\x1C\x02\x02\u04D7\u015C" + - "\x03\x02\x02\x02\u04D8\u04D9\t\x1D\x02\x02\u04D9\u015E\x03\x02\x02\x02" + - "\u04DA\u04DB\t\x1E\x02\x02\u04DB\u0160\x03\x02\x02\x02\u04DC\u04DD\t\x1F" + - "\x02\x02\u04DD\u0162\x03\x02\x02\x02\u04DE\u04DF\t \x02\x02\u04DF\u0164" + - "\x03\x02\x02\x02\u04E0\u04E1\t!\x02\x02\u04E1\u0166\x03\x02\x02\x02\u04E2" + - "\u04E3\t\"\x02\x02\u04E3\u0168\x03\x02\x02\x02\u04E4\u04E5\t#\x02\x02" + - "\u04E5\u016A\x03\x02\x02\x02\u04E6\u04E7\t$\x02\x02\u04E7\u016C\x03\x02" + - "\x02\x02\u04E8\u04E9\t%\x02\x02\u04E9\u016E\x03\x02\x02\x02\u04EA\u04EB" + - "\t&\x02\x02\u04EB\u0170\x03\x02\x02\x02\u04EC\u04ED\t\'\x02\x02\u04ED" + - "\u0172\x03\x02\x02\x028\x02\x03\x04\x05\x06\x07\b\t\n\v\f\u020F\u0219" + - "\u021D\u0220\u0229\u022B\u0236\u025F\u0264\u026D\u0274\u0279\u027B\u0286" + - "\u028E\u0291\u0293\u0298\u029D\u02A3\u02AA\u02AF\u02B5\u02B8\u02C0\u02C4" + - "\u0343\u0348\u034D\u034F\u0355\u0386\u038B\u03AE\u03B2\u03B7\u03BC\u03C1" + - "\u03C3\u041B\u0420\u04AA\u04AC\x1A\x07\x04\x02\x07\x06\x02\x07\b\x02\x07" + - "\x03\x02\x07\x05\x02\x07\n\x02\x07\x07\x02\x07\v\x02\x02\x03\x02\tA\x02" + - "\x07\x02\x02\t\x1C\x02\x06\x02\x02\tB\x02\t$\x02\t#\x02\tD\x02\t&\x02" + - "\tM\x02\x07\f\x02\x07\t\x02\tW\x02\tV\x02\tC\x02"; + "\x02\u044B\u044C\x03\x02\x02\x02\u044C\u044D\b\x82\x13\x02\u044D\u010E" + + "\x03\x02\x02\x02\u044E\u044F\x05\xF7w\x02\u044F\u0450\x03\x02\x02\x02" + + "\u0450\u0451\b\x83\x18\x02\u0451\u0110\x03\x02\x02\x02\u0452\u0453\x05" + + "\xD1d\x02\u0453\u0454\x03\x02\x02\x02\u0454\u0455\b\x84\x14\x02\u0455" + + "\u0112\x03\x02\x02\x02\u0456\u0457\x05\xA9P\x02\u0457\u0458\x03\x02\x02" + + "\x02\u0458\u0459\b\x85\x12\x02\u0459\u0114\x03\x02\x02\x02\u045A\u045B" + + "\x053\x15\x02\u045B\u045C\x03\x02\x02\x02\u045C\u045D\b\x86\n\x02\u045D" + + "\u0116\x03\x02\x02\x02\u045E\u045F\x055\x16\x02\u045F\u0460\x03\x02\x02" + + "\x02\u0460\u0461\b\x87\n\x02\u0461\u0118\x03\x02\x02\x02\u0462\u0463\x05" + + "7\x17\x02\u0463\u0464\x03\x02\x02\x02\u0464\u0465\b\x88\n\x02\u0465\u011A" + + "\x03\x02\x02\x02\u0466\u0467\x05C\x1D\x02\u0467\u0468\x03\x02\x02\x02" + + "\u0468\u0469\b\x89\r\x02\u0469\u046A\b\x89\x0E\x02\u046A\u011C\x03\x02" + + "\x02\x02\u046B\u046C\x05k1\x02\u046C\u046D\x03\x02\x02\x02\u046D\u046E" + + "\b\x8A\x13\x02\u046E\u011E\x03\x02\x02\x02\u046F\u0470\x05\xA9P\x02\u0470" + + "\u0471\x03\x02\x02\x02\u0471\u0472\b\x8B\x12\x02\u0472\u0120\x03\x02\x02" + + "\x02\u0473\u0474\x05\xA7O\x02\u0474\u0475\x03\x02\x02\x02\u0475\u0476" + + "\b\x8C\x19\x02\u0476\u0122\x03\x02\x02\x02\u0477\u0478\x053\x15\x02\u0478" + + "\u0479\x03\x02\x02\x02\u0479\u047A\b\x8D\n\x02\u047A\u0124\x03\x02\x02" + + "\x02\u047B\u047C\x055\x16\x02\u047C\u047D\x03\x02\x02\x02\u047D\u047E" + + "\b\x8E\n\x02\u047E\u0126\x03\x02\x02\x02\u047F\u0480\x057\x17\x02\u0480" + + "\u0481\x03\x02\x02\x02\u0481\u0482\b\x8F\n\x02\u0482\u0128\x03\x02\x02" + + "\x02\u0483\u0484\x05C\x1D\x02\u0484\u0485\x03\x02\x02\x02\u0485\u0486" + + "\b\x90\r\x02\u0486\u0487\b\x90\x0E\x02\u0487\u012A\x03\x02\x02\x02\u0488" + + "\u0489\x05\u0151\xA4\x02\u0489\u048A\x05\u015B\xA9\x02\u048A\u048B\x05" + + "\u014B\xA1\x02\u048B\u048C\x05\u015D\xAA\x02\u048C\u012C\x03\x02\x02\x02" + + "\u048D\u048E\x05\u014B\xA1\x02\u048E\u048F\x05\u0169\xB0\x02\u048F\u0490" + + "\x05\u015B\xA9\x02\u0490\u0491\x05\u0145\x9E\x02\u0491\u0492\x05\u0167" + + "\xAF\x02\u0492\u0493\x05\u0151\xA4\x02\u0493\u0494\x05\u015D\xAA\x02\u0494" + + "\u0495\x05\u015B\xA9\x02\u0495\u0496\x05\u0165\xAE\x02\u0496\u012E\x03" + + "\x02\x02\x02\u0497\u0498\x053\x15\x02\u0498\u0499\x03\x02\x02\x02\u0499" + + "\u049A\b\x93\n\x02\u049A\u0130\x03\x02\x02\x02\u049B\u049C\x055\x16\x02" + + "\u049C\u049D\x03\x02\x02\x02\u049D\u049E\b\x94\n\x02\u049E\u0132\x03\x02" + + "\x02\x02\u049F\u04A0\x057\x17\x02\u04A0\u04A1\x03\x02\x02\x02\u04A1\u04A2" + + "\b\x95\n\x02\u04A2\u0134\x03\x02\x02\x02\u04A3\u04A4\x05\xA5N\x02\u04A4" + + "\u04A5\x03\x02\x02\x02\u04A5\u04A6\b\x96\x0F\x02\u04A6\u04A7\b\x96\x0E" + + "\x02\u04A7\u0136\x03\x02\x02\x02\u04A8\u04A9\x07<\x02\x02\u04A9\u0138" + + "\x03\x02\x02\x02\u04AA\u04B0\x05O#\x02\u04AB\u04B0\x05E\x1E\x02\u04AC" + + "\u04B0\x05k1\x02\u04AD\u04B0\x05G\x1F\x02\u04AE\u04B0\x05U&\x02\u04AF" + + "\u04AA\x03\x02\x02\x02\u04AF\u04AB\x03\x02\x02\x02\u04AF\u04AC\x03\x02" + + "\x02\x02\u04AF\u04AD\x03\x02\x02\x02\u04AF\u04AE\x03\x02\x02\x02\u04B0" + + "\u04B1\x03\x02\x02\x02\u04B1\u04AF\x03\x02\x02\x02\u04B1\u04B2\x03\x02" + + "\x02\x02\u04B2\u013A\x03\x02\x02\x02\u04B3\u04B4\x053\x15\x02\u04B4\u04B5" + + "\x03\x02\x02\x02\u04B5\u04B6\b\x99\n\x02\u04B6\u013C\x03\x02\x02\x02\u04B7" + + "\u04B8\x055\x16\x02\u04B8\u04B9\x03\x02\x02\x02\u04B9\u04BA\b\x9A\n\x02" + + "\u04BA\u013E\x03\x02\x02\x02\u04BB\u04BC\x057\x17\x02\u04BC\u04BD\x03" + + "\x02\x02\x02\u04BD\u04BE\b\x9B\n\x02\u04BE\u0140\x03\x02\x02\x02\u04BF" + + "\u04C0\t\x0F\x02\x02\u04C0\u0142\x03\x02\x02\x02\u04C1\u04C2\t\x10\x02" + + "\x02\u04C2\u0144\x03\x02\x02\x02\u04C3\u04C4\t\x11\x02\x02\u04C4\u0146" + + "\x03\x02\x02\x02\u04C5\u04C6\t\x12\x02\x02\u04C6\u0148\x03\x02\x02\x02" + + "\u04C7\u04C8\t\t\x02\x02\u04C8\u014A\x03\x02\x02\x02\u04C9\u04CA\t\x13" + + "\x02\x02\u04CA\u014C\x03\x02\x02\x02\u04CB\u04CC\t\x14\x02\x02\u04CC\u014E" + + "\x03\x02\x02\x02\u04CD\u04CE\t\x15\x02\x02\u04CE\u0150\x03\x02\x02\x02" + + "\u04CF\u04D0\t\x16\x02\x02\u04D0\u0152\x03\x02\x02\x02\u04D1\u04D2\t\x17" + + "\x02\x02\u04D2\u0154\x03\x02\x02\x02\u04D3\u04D4\t\x18\x02\x02\u04D4\u0156" + + "\x03\x02\x02\x02\u04D5\u04D6\t\x19\x02\x02\u04D6\u0158\x03\x02\x02\x02" + + "\u04D7\u04D8\t\x1A\x02\x02\u04D8\u015A\x03\x02\x02\x02\u04D9\u04DA\t\x1B" + + "\x02\x02\u04DA\u015C\x03\x02\x02\x02\u04DB\u04DC\t\x1C\x02\x02\u04DC\u015E" + + "\x03\x02\x02\x02\u04DD\u04DE\t\x1D\x02\x02\u04DE\u0160\x03\x02\x02\x02" + + "\u04DF\u04E0\t\x1E\x02\x02\u04E0\u0162\x03\x02\x02\x02\u04E1\u04E2\t\x1F" + + "\x02\x02\u04E2\u0164\x03\x02\x02\x02\u04E3\u04E4\t \x02\x02\u04E4\u0166" + + "\x03\x02\x02\x02\u04E5\u04E6\t!\x02\x02\u04E6\u0168\x03\x02\x02\x02\u04E7" + + "\u04E8\t\"\x02\x02\u04E8\u016A\x03\x02\x02\x02\u04E9\u04EA\t#\x02\x02" + + "\u04EA\u016C\x03\x02\x02\x02\u04EB\u04EC\t$\x02\x02\u04EC\u016E\x03\x02" + + "\x02\x02\u04ED\u04EE\t%\x02\x02\u04EE\u0170\x03\x02\x02\x02\u04EF\u04F0" + + "\t&\x02\x02\u04F0\u0172\x03\x02\x02\x02\u04F1\u04F2\t\'\x02\x02\u04F2" + + "\u0174\x03\x02\x02\x028\x02\x03\x04\x05\x06\x07\b\t\n\v\f\u0211\u021B" + + "\u021F\u0222\u022B\u022D\u0238\u0261\u0266\u026F\u0276\u027B\u027D\u0288" + + "\u0290\u0293\u0295\u029A\u029F\u02A5\u02AC\u02B1\u02B7\u02BA\u02C2\u02C6" + + "\u0348\u034D\u0352\u0354\u035A\u038B\u0390\u03B3\u03B7\u03BC\u03C1\u03C6" + + "\u03C8\u0420\u0425\u04AF\u04B1\x1A\x07\x04\x02\x07\x06\x02\x07\b\x02\x07" + + "\x03\x02\x07\x05\x02\x07\n\x02\x07\x07\x02\x07\v\x02\x02\x03\x02\tB\x02" + + "\x07\x02\x02\t\x1C\x02\x06\x02\x02\tC\x02\t$\x02\t#\x02\tE\x02\t&\x02" + + "\tN\x02\x07\f\x02\x07\t\x02\tX\x02\tW\x02\tD\x02"; public static readonly _serializedATN: string = Utils.join( [ esql_lexer._serializedATNSegment0, diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 index 9c637d1917a11..57e7097eb03f8 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.g4 @@ -225,7 +225,7 @@ string ; comparisonOperator - : EQ | NEQ | LT | LTE | GT | GTE + : EQ | CIEQ | NEQ | LT | LTE | GT | GTE ; explainCommand diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp index a9cf5f8472a52..ed3cd7a8d9227 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp @@ -52,6 +52,7 @@ null ')' null '==' +'=~' '!=' '<' '<=' @@ -159,6 +160,7 @@ RLIKE RP TRUE EQ +CIEQ NEQ LT LTE @@ -265,4 +267,4 @@ setting atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 106, 525, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 110, 10, 3, 12, 3, 14, 3, 113, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 119, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 134, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 146, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 153, 10, 7, 12, 7, 14, 7, 156, 11, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 163, 10, 7, 3, 7, 3, 7, 5, 7, 167, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 175, 10, 7, 12, 7, 14, 7, 178, 11, 7, 3, 8, 3, 8, 5, 8, 182, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 189, 10, 8, 3, 8, 3, 8, 3, 8, 5, 8, 194, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 201, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 207, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 215, 10, 10, 12, 10, 14, 10, 218, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 227, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 235, 10, 12, 12, 12, 14, 12, 238, 11, 12, 5, 12, 240, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 7, 14, 250, 10, 14, 12, 14, 14, 14, 253, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 260, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 266, 10, 16, 12, 16, 14, 16, 269, 11, 16, 3, 16, 5, 16, 272, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 279, 10, 17, 12, 17, 14, 17, 282, 11, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 291, 10, 19, 3, 19, 3, 19, 5, 19, 295, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 308, 10, 22, 12, 22, 14, 22, 311, 11, 22, 3, 23, 3, 23, 3, 23, 7, 23, 316, 10, 23, 12, 23, 14, 23, 319, 11, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 338, 10, 26, 12, 26, 14, 26, 341, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 349, 10, 26, 12, 26, 14, 26, 352, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 360, 10, 26, 12, 26, 14, 26, 363, 11, 26, 3, 26, 3, 26, 5, 26, 367, 10, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 376, 10, 28, 12, 28, 14, 28, 379, 11, 28, 3, 29, 3, 29, 5, 29, 383, 10, 29, 3, 29, 3, 29, 5, 29, 387, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 393, 10, 30, 12, 30, 14, 30, 396, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 402, 10, 30, 12, 30, 14, 30, 405, 11, 30, 5, 30, 407, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 413, 10, 31, 12, 31, 14, 31, 416, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 422, 10, 32, 12, 32, 14, 32, 425, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 435, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 7, 37, 447, 10, 37, 12, 37, 14, 37, 450, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 5, 40, 460, 10, 40, 3, 41, 5, 41, 463, 10, 41, 3, 41, 3, 41, 3, 42, 5, 42, 468, 10, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 487, 10, 47, 3, 48, 3, 48, 7, 48, 491, 10, 48, 12, 48, 14, 48, 494, 11, 48, 3, 48, 3, 48, 3, 48, 5, 48, 499, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 7, 48, 505, 10, 48, 12, 48, 14, 48, 508, 11, 48, 5, 48, 510, 10, 48, 3, 49, 3, 49, 3, 49, 5, 49, 515, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 2, 2, 5, 4, 12, 18, 51, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 90, 2, 92, 2, 94, 2, 96, 2, 98, 2, 2, 11, 3, 2, 60, 61, 3, 2, 62, 64, 4, 2, 68, 68, 73, 73, 3, 2, 67, 68, 4, 2, 68, 68, 77, 77, 4, 2, 34, 34, 37, 37, 3, 2, 40, 41, 4, 2, 39, 39, 53, 53, 3, 2, 54, 59, 2, 554, 2, 100, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 6, 118, 3, 2, 2, 2, 8, 133, 3, 2, 2, 2, 10, 135, 3, 2, 2, 2, 12, 166, 3, 2, 2, 2, 14, 193, 3, 2, 2, 2, 16, 200, 3, 2, 2, 2, 18, 206, 3, 2, 2, 2, 20, 226, 3, 2, 2, 2, 22, 228, 3, 2, 2, 2, 24, 243, 3, 2, 2, 2, 26, 246, 3, 2, 2, 2, 28, 259, 3, 2, 2, 2, 30, 261, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 285, 3, 2, 2, 2, 36, 288, 3, 2, 2, 2, 38, 296, 3, 2, 2, 2, 40, 302, 3, 2, 2, 2, 42, 304, 3, 2, 2, 2, 44, 312, 3, 2, 2, 2, 46, 320, 3, 2, 2, 2, 48, 322, 3, 2, 2, 2, 50, 366, 3, 2, 2, 2, 52, 368, 3, 2, 2, 2, 54, 371, 3, 2, 2, 2, 56, 380, 3, 2, 2, 2, 58, 406, 3, 2, 2, 2, 60, 408, 3, 2, 2, 2, 62, 417, 3, 2, 2, 2, 64, 426, 3, 2, 2, 2, 66, 430, 3, 2, 2, 2, 68, 436, 3, 2, 2, 2, 70, 440, 3, 2, 2, 2, 72, 443, 3, 2, 2, 2, 74, 451, 3, 2, 2, 2, 76, 455, 3, 2, 2, 2, 78, 459, 3, 2, 2, 2, 80, 462, 3, 2, 2, 2, 82, 467, 3, 2, 2, 2, 84, 471, 3, 2, 2, 2, 86, 473, 3, 2, 2, 2, 88, 475, 3, 2, 2, 2, 90, 478, 3, 2, 2, 2, 92, 486, 3, 2, 2, 2, 94, 488, 3, 2, 2, 2, 96, 514, 3, 2, 2, 2, 98, 518, 3, 2, 2, 2, 100, 101, 5, 4, 3, 2, 101, 102, 7, 2, 2, 3, 102, 3, 3, 2, 2, 2, 103, 104, 8, 3, 1, 2, 104, 105, 5, 6, 4, 2, 105, 111, 3, 2, 2, 2, 106, 107, 12, 3, 2, 2, 107, 108, 7, 28, 2, 2, 108, 110, 5, 8, 5, 2, 109, 106, 3, 2, 2, 2, 110, 113, 3, 2, 2, 2, 111, 109, 3, 2, 2, 2, 111, 112, 3, 2, 2, 2, 112, 5, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 114, 119, 5, 88, 45, 2, 115, 119, 5, 30, 16, 2, 116, 119, 5, 24, 13, 2, 117, 119, 5, 92, 47, 2, 118, 114, 3, 2, 2, 2, 118, 115, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 117, 3, 2, 2, 2, 119, 7, 3, 2, 2, 2, 120, 134, 5, 34, 18, 2, 121, 134, 5, 38, 20, 2, 122, 134, 5, 52, 27, 2, 123, 134, 5, 58, 30, 2, 124, 134, 5, 54, 28, 2, 125, 134, 5, 36, 19, 2, 126, 134, 5, 10, 6, 2, 127, 134, 5, 60, 31, 2, 128, 134, 5, 62, 32, 2, 129, 134, 5, 66, 34, 2, 130, 134, 5, 68, 35, 2, 131, 134, 5, 94, 48, 2, 132, 134, 5, 70, 36, 2, 133, 120, 3, 2, 2, 2, 133, 121, 3, 2, 2, 2, 133, 122, 3, 2, 2, 2, 133, 123, 3, 2, 2, 2, 133, 124, 3, 2, 2, 2, 133, 125, 3, 2, 2, 2, 133, 126, 3, 2, 2, 2, 133, 127, 3, 2, 2, 2, 133, 128, 3, 2, 2, 2, 133, 129, 3, 2, 2, 2, 133, 130, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 132, 3, 2, 2, 2, 134, 9, 3, 2, 2, 2, 135, 136, 7, 20, 2, 2, 136, 137, 5, 12, 7, 2, 137, 11, 3, 2, 2, 2, 138, 139, 8, 7, 1, 2, 139, 140, 7, 46, 2, 2, 140, 167, 5, 12, 7, 9, 141, 167, 5, 16, 9, 2, 142, 167, 5, 14, 8, 2, 143, 145, 5, 16, 9, 2, 144, 146, 7, 46, 2, 2, 145, 144, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 148, 7, 43, 2, 2, 148, 149, 7, 42, 2, 2, 149, 154, 5, 16, 9, 2, 150, 151, 7, 36, 2, 2, 151, 153, 5, 16, 9, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 157, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 157, 158, 7, 52, 2, 2, 158, 167, 3, 2, 2, 2, 159, 160, 5, 16, 9, 2, 160, 162, 7, 44, 2, 2, 161, 163, 7, 46, 2, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 165, 7, 47, 2, 2, 165, 167, 3, 2, 2, 2, 166, 138, 3, 2, 2, 2, 166, 141, 3, 2, 2, 2, 166, 142, 3, 2, 2, 2, 166, 143, 3, 2, 2, 2, 166, 159, 3, 2, 2, 2, 167, 176, 3, 2, 2, 2, 168, 169, 12, 6, 2, 2, 169, 170, 7, 33, 2, 2, 170, 175, 5, 12, 7, 7, 171, 172, 12, 5, 2, 2, 172, 173, 7, 49, 2, 2, 173, 175, 5, 12, 7, 6, 174, 168, 3, 2, 2, 2, 174, 171, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 13, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 16, 9, 2, 180, 182, 7, 46, 2, 2, 181, 180, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 7, 45, 2, 2, 184, 185, 5, 84, 43, 2, 185, 194, 3, 2, 2, 2, 186, 188, 5, 16, 9, 2, 187, 189, 7, 46, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 7, 51, 2, 2, 191, 192, 5, 84, 43, 2, 192, 194, 3, 2, 2, 2, 193, 179, 3, 2, 2, 2, 193, 186, 3, 2, 2, 2, 194, 15, 3, 2, 2, 2, 195, 201, 5, 18, 10, 2, 196, 197, 5, 18, 10, 2, 197, 198, 5, 86, 44, 2, 198, 199, 5, 18, 10, 2, 199, 201, 3, 2, 2, 2, 200, 195, 3, 2, 2, 2, 200, 196, 3, 2, 2, 2, 201, 17, 3, 2, 2, 2, 202, 203, 8, 10, 1, 2, 203, 207, 5, 20, 11, 2, 204, 205, 9, 2, 2, 2, 205, 207, 5, 18, 10, 5, 206, 202, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 216, 3, 2, 2, 2, 208, 209, 12, 4, 2, 2, 209, 210, 9, 3, 2, 2, 210, 215, 5, 18, 10, 5, 211, 212, 12, 3, 2, 2, 212, 213, 9, 2, 2, 2, 213, 215, 5, 18, 10, 4, 214, 208, 3, 2, 2, 2, 214, 211, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 19, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 227, 5, 50, 26, 2, 220, 227, 5, 42, 22, 2, 221, 227, 5, 22, 12, 2, 222, 223, 7, 42, 2, 2, 223, 224, 5, 12, 7, 2, 224, 225, 7, 52, 2, 2, 225, 227, 3, 2, 2, 2, 226, 219, 3, 2, 2, 2, 226, 220, 3, 2, 2, 2, 226, 221, 3, 2, 2, 2, 226, 222, 3, 2, 2, 2, 227, 21, 3, 2, 2, 2, 228, 229, 5, 46, 24, 2, 229, 239, 7, 42, 2, 2, 230, 240, 7, 62, 2, 2, 231, 236, 5, 12, 7, 2, 232, 233, 7, 36, 2, 2, 233, 235, 5, 12, 7, 2, 234, 232, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 240, 3, 2, 2, 2, 238, 236, 3, 2, 2, 2, 239, 230, 3, 2, 2, 2, 239, 231, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 52, 2, 2, 242, 23, 3, 2, 2, 2, 243, 244, 7, 16, 2, 2, 244, 245, 5, 26, 14, 2, 245, 25, 3, 2, 2, 2, 246, 251, 5, 28, 15, 2, 247, 248, 7, 36, 2, 2, 248, 250, 5, 28, 15, 2, 249, 247, 3, 2, 2, 2, 250, 253, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 27, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 254, 260, 5, 12, 7, 2, 255, 256, 5, 42, 22, 2, 256, 257, 7, 35, 2, 2, 257, 258, 5, 12, 7, 2, 258, 260, 3, 2, 2, 2, 259, 254, 3, 2, 2, 2, 259, 255, 3, 2, 2, 2, 260, 29, 3, 2, 2, 2, 261, 262, 7, 8, 2, 2, 262, 267, 5, 40, 21, 2, 263, 264, 7, 36, 2, 2, 264, 266, 5, 40, 21, 2, 265, 263, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 272, 5, 32, 17, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 65, 2, 2, 274, 275, 7, 72, 2, 2, 275, 280, 5, 40, 21, 2, 276, 277, 7, 36, 2, 2, 277, 279, 5, 40, 21, 2, 278, 276, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 284, 7, 66, 2, 2, 284, 33, 3, 2, 2, 2, 285, 286, 7, 6, 2, 2, 286, 287, 5, 26, 14, 2, 287, 35, 3, 2, 2, 2, 288, 290, 7, 19, 2, 2, 289, 291, 5, 26, 14, 2, 290, 289, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 293, 7, 32, 2, 2, 293, 295, 5, 26, 14, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 37, 3, 2, 2, 2, 296, 297, 7, 10, 2, 2, 297, 300, 5, 26, 14, 2, 298, 299, 7, 32, 2, 2, 299, 301, 5, 26, 14, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 39, 3, 2, 2, 2, 302, 303, 9, 4, 2, 2, 303, 41, 3, 2, 2, 2, 304, 309, 5, 46, 24, 2, 305, 306, 7, 38, 2, 2, 306, 308, 5, 46, 24, 2, 307, 305, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 43, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 317, 5, 48, 25, 2, 313, 314, 7, 38, 2, 2, 314, 316, 5, 48, 25, 2, 315, 313, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 45, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 320, 321, 9, 5, 2, 2, 321, 47, 3, 2, 2, 2, 322, 323, 9, 6, 2, 2, 323, 49, 3, 2, 2, 2, 324, 367, 7, 47, 2, 2, 325, 326, 5, 82, 42, 2, 326, 327, 7, 67, 2, 2, 327, 367, 3, 2, 2, 2, 328, 367, 5, 80, 41, 2, 329, 367, 5, 82, 42, 2, 330, 367, 5, 76, 39, 2, 331, 367, 7, 50, 2, 2, 332, 367, 5, 84, 43, 2, 333, 334, 7, 65, 2, 2, 334, 339, 5, 78, 40, 2, 335, 336, 7, 36, 2, 2, 336, 338, 5, 78, 40, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 342, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 343, 7, 66, 2, 2, 343, 367, 3, 2, 2, 2, 344, 345, 7, 65, 2, 2, 345, 350, 5, 76, 39, 2, 346, 347, 7, 36, 2, 2, 347, 349, 5, 76, 39, 2, 348, 346, 3, 2, 2, 2, 349, 352, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 353, 354, 7, 66, 2, 2, 354, 367, 3, 2, 2, 2, 355, 356, 7, 65, 2, 2, 356, 361, 5, 84, 43, 2, 357, 358, 7, 36, 2, 2, 358, 360, 5, 84, 43, 2, 359, 357, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 364, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 364, 365, 7, 66, 2, 2, 365, 367, 3, 2, 2, 2, 366, 324, 3, 2, 2, 2, 366, 325, 3, 2, 2, 2, 366, 328, 3, 2, 2, 2, 366, 329, 3, 2, 2, 2, 366, 330, 3, 2, 2, 2, 366, 331, 3, 2, 2, 2, 366, 332, 3, 2, 2, 2, 366, 333, 3, 2, 2, 2, 366, 344, 3, 2, 2, 2, 366, 355, 3, 2, 2, 2, 367, 51, 3, 2, 2, 2, 368, 369, 7, 12, 2, 2, 369, 370, 7, 30, 2, 2, 370, 53, 3, 2, 2, 2, 371, 372, 7, 18, 2, 2, 372, 377, 5, 56, 29, 2, 373, 374, 7, 36, 2, 2, 374, 376, 5, 56, 29, 2, 375, 373, 3, 2, 2, 2, 376, 379, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 55, 3, 2, 2, 2, 379, 377, 3, 2, 2, 2, 380, 382, 5, 12, 7, 2, 381, 383, 9, 7, 2, 2, 382, 381, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 385, 7, 48, 2, 2, 385, 387, 9, 8, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 57, 3, 2, 2, 2, 388, 389, 7, 11, 2, 2, 389, 394, 5, 44, 23, 2, 390, 391, 7, 36, 2, 2, 391, 393, 5, 44, 23, 2, 392, 390, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 407, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 7, 14, 2, 2, 398, 403, 5, 44, 23, 2, 399, 400, 7, 36, 2, 2, 400, 402, 5, 44, 23, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 407, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 388, 3, 2, 2, 2, 406, 397, 3, 2, 2, 2, 407, 59, 3, 2, 2, 2, 408, 409, 7, 4, 2, 2, 409, 414, 5, 44, 23, 2, 410, 411, 7, 36, 2, 2, 411, 413, 5, 44, 23, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 61, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 15, 2, 2, 418, 423, 5, 64, 33, 2, 419, 420, 7, 36, 2, 2, 420, 422, 5, 64, 33, 2, 421, 419, 3, 2, 2, 2, 422, 425, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 63, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 426, 427, 5, 44, 23, 2, 427, 428, 7, 81, 2, 2, 428, 429, 5, 44, 23, 2, 429, 65, 3, 2, 2, 2, 430, 431, 7, 3, 2, 2, 431, 432, 5, 20, 11, 2, 432, 434, 5, 84, 43, 2, 433, 435, 5, 72, 37, 2, 434, 433, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 67, 3, 2, 2, 2, 436, 437, 7, 9, 2, 2, 437, 438, 5, 20, 11, 2, 438, 439, 5, 84, 43, 2, 439, 69, 3, 2, 2, 2, 440, 441, 7, 13, 2, 2, 441, 442, 5, 42, 22, 2, 442, 71, 3, 2, 2, 2, 443, 448, 5, 74, 38, 2, 444, 445, 7, 36, 2, 2, 445, 447, 5, 74, 38, 2, 446, 444, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 73, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 452, 5, 46, 24, 2, 452, 453, 7, 35, 2, 2, 453, 454, 5, 50, 26, 2, 454, 75, 3, 2, 2, 2, 455, 456, 9, 9, 2, 2, 456, 77, 3, 2, 2, 2, 457, 460, 5, 80, 41, 2, 458, 460, 5, 82, 42, 2, 459, 457, 3, 2, 2, 2, 459, 458, 3, 2, 2, 2, 460, 79, 3, 2, 2, 2, 461, 463, 9, 2, 2, 2, 462, 461, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 7, 31, 2, 2, 465, 81, 3, 2, 2, 2, 466, 468, 9, 2, 2, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 30, 2, 2, 470, 83, 3, 2, 2, 2, 471, 472, 7, 29, 2, 2, 472, 85, 3, 2, 2, 2, 473, 474, 9, 10, 2, 2, 474, 87, 3, 2, 2, 2, 475, 476, 7, 7, 2, 2, 476, 477, 5, 90, 46, 2, 477, 89, 3, 2, 2, 2, 478, 479, 7, 65, 2, 2, 479, 480, 5, 4, 3, 2, 480, 481, 7, 66, 2, 2, 481, 91, 3, 2, 2, 2, 482, 483, 7, 17, 2, 2, 483, 487, 7, 97, 2, 2, 484, 485, 7, 17, 2, 2, 485, 487, 7, 98, 2, 2, 486, 482, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 487, 93, 3, 2, 2, 2, 488, 492, 7, 5, 2, 2, 489, 491, 5, 98, 50, 2, 490, 489, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 495, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 498, 7, 87, 2, 2, 496, 497, 7, 85, 2, 2, 497, 499, 5, 44, 23, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 509, 3, 2, 2, 2, 500, 501, 7, 86, 2, 2, 501, 506, 5, 96, 49, 2, 502, 503, 7, 36, 2, 2, 503, 505, 5, 96, 49, 2, 504, 502, 3, 2, 2, 2, 505, 508, 3, 2, 2, 2, 506, 504, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 509, 500, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 95, 3, 2, 2, 2, 511, 512, 5, 44, 23, 2, 512, 513, 7, 35, 2, 2, 513, 515, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 5, 44, 23, 2, 517, 97, 3, 2, 2, 2, 518, 519, 7, 65, 2, 2, 519, 520, 7, 103, 2, 2, 520, 521, 7, 102, 2, 2, 521, 522, 7, 103, 2, 2, 522, 523, 7, 66, 2, 2, 523, 99, 3, 2, 2, 2, 54, 111, 118, 133, 145, 154, 162, 166, 174, 176, 181, 188, 193, 200, 206, 214, 216, 226, 236, 239, 251, 259, 267, 271, 280, 290, 294, 300, 309, 317, 339, 350, 361, 366, 377, 382, 386, 394, 403, 406, 414, 423, 434, 448, 459, 462, 467, 486, 492, 498, 506, 509, 514] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 107, 525, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 110, 10, 3, 12, 3, 14, 3, 113, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 119, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 134, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 146, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 153, 10, 7, 12, 7, 14, 7, 156, 11, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 163, 10, 7, 3, 7, 3, 7, 5, 7, 167, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 175, 10, 7, 12, 7, 14, 7, 178, 11, 7, 3, 8, 3, 8, 5, 8, 182, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 189, 10, 8, 3, 8, 3, 8, 3, 8, 5, 8, 194, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 201, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 207, 10, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 215, 10, 10, 12, 10, 14, 10, 218, 11, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 227, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 235, 10, 12, 12, 12, 14, 12, 238, 11, 12, 5, 12, 240, 10, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 7, 14, 250, 10, 14, 12, 14, 14, 14, 253, 11, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 260, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 266, 10, 16, 12, 16, 14, 16, 269, 11, 16, 3, 16, 5, 16, 272, 10, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 279, 10, 17, 12, 17, 14, 17, 282, 11, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 291, 10, 19, 3, 19, 3, 19, 5, 19, 295, 10, 19, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 301, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 7, 22, 308, 10, 22, 12, 22, 14, 22, 311, 11, 22, 3, 23, 3, 23, 3, 23, 7, 23, 316, 10, 23, 12, 23, 14, 23, 319, 11, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 338, 10, 26, 12, 26, 14, 26, 341, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 349, 10, 26, 12, 26, 14, 26, 352, 11, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 360, 10, 26, 12, 26, 14, 26, 363, 11, 26, 3, 26, 3, 26, 5, 26, 367, 10, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 376, 10, 28, 12, 28, 14, 28, 379, 11, 28, 3, 29, 3, 29, 5, 29, 383, 10, 29, 3, 29, 3, 29, 5, 29, 387, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 393, 10, 30, 12, 30, 14, 30, 396, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 402, 10, 30, 12, 30, 14, 30, 405, 11, 30, 5, 30, 407, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 413, 10, 31, 12, 31, 14, 31, 416, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 7, 32, 422, 10, 32, 12, 32, 14, 32, 425, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 435, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 7, 37, 447, 10, 37, 12, 37, 14, 37, 450, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 5, 40, 460, 10, 40, 3, 41, 5, 41, 463, 10, 41, 3, 41, 3, 41, 3, 42, 5, 42, 468, 10, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 487, 10, 47, 3, 48, 3, 48, 7, 48, 491, 10, 48, 12, 48, 14, 48, 494, 11, 48, 3, 48, 3, 48, 3, 48, 5, 48, 499, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 7, 48, 505, 10, 48, 12, 48, 14, 48, 508, 11, 48, 5, 48, 510, 10, 48, 3, 49, 3, 49, 3, 49, 5, 49, 515, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 2, 2, 5, 4, 12, 18, 51, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 88, 2, 90, 2, 92, 2, 94, 2, 96, 2, 98, 2, 2, 11, 3, 2, 61, 62, 3, 2, 63, 65, 4, 2, 69, 69, 74, 74, 3, 2, 68, 69, 4, 2, 69, 69, 78, 78, 4, 2, 34, 34, 37, 37, 3, 2, 40, 41, 4, 2, 39, 39, 53, 53, 3, 2, 54, 60, 2, 554, 2, 100, 3, 2, 2, 2, 4, 103, 3, 2, 2, 2, 6, 118, 3, 2, 2, 2, 8, 133, 3, 2, 2, 2, 10, 135, 3, 2, 2, 2, 12, 166, 3, 2, 2, 2, 14, 193, 3, 2, 2, 2, 16, 200, 3, 2, 2, 2, 18, 206, 3, 2, 2, 2, 20, 226, 3, 2, 2, 2, 22, 228, 3, 2, 2, 2, 24, 243, 3, 2, 2, 2, 26, 246, 3, 2, 2, 2, 28, 259, 3, 2, 2, 2, 30, 261, 3, 2, 2, 2, 32, 273, 3, 2, 2, 2, 34, 285, 3, 2, 2, 2, 36, 288, 3, 2, 2, 2, 38, 296, 3, 2, 2, 2, 40, 302, 3, 2, 2, 2, 42, 304, 3, 2, 2, 2, 44, 312, 3, 2, 2, 2, 46, 320, 3, 2, 2, 2, 48, 322, 3, 2, 2, 2, 50, 366, 3, 2, 2, 2, 52, 368, 3, 2, 2, 2, 54, 371, 3, 2, 2, 2, 56, 380, 3, 2, 2, 2, 58, 406, 3, 2, 2, 2, 60, 408, 3, 2, 2, 2, 62, 417, 3, 2, 2, 2, 64, 426, 3, 2, 2, 2, 66, 430, 3, 2, 2, 2, 68, 436, 3, 2, 2, 2, 70, 440, 3, 2, 2, 2, 72, 443, 3, 2, 2, 2, 74, 451, 3, 2, 2, 2, 76, 455, 3, 2, 2, 2, 78, 459, 3, 2, 2, 2, 80, 462, 3, 2, 2, 2, 82, 467, 3, 2, 2, 2, 84, 471, 3, 2, 2, 2, 86, 473, 3, 2, 2, 2, 88, 475, 3, 2, 2, 2, 90, 478, 3, 2, 2, 2, 92, 486, 3, 2, 2, 2, 94, 488, 3, 2, 2, 2, 96, 514, 3, 2, 2, 2, 98, 518, 3, 2, 2, 2, 100, 101, 5, 4, 3, 2, 101, 102, 7, 2, 2, 3, 102, 3, 3, 2, 2, 2, 103, 104, 8, 3, 1, 2, 104, 105, 5, 6, 4, 2, 105, 111, 3, 2, 2, 2, 106, 107, 12, 3, 2, 2, 107, 108, 7, 28, 2, 2, 108, 110, 5, 8, 5, 2, 109, 106, 3, 2, 2, 2, 110, 113, 3, 2, 2, 2, 111, 109, 3, 2, 2, 2, 111, 112, 3, 2, 2, 2, 112, 5, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 114, 119, 5, 88, 45, 2, 115, 119, 5, 30, 16, 2, 116, 119, 5, 24, 13, 2, 117, 119, 5, 92, 47, 2, 118, 114, 3, 2, 2, 2, 118, 115, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 117, 3, 2, 2, 2, 119, 7, 3, 2, 2, 2, 120, 134, 5, 34, 18, 2, 121, 134, 5, 38, 20, 2, 122, 134, 5, 52, 27, 2, 123, 134, 5, 58, 30, 2, 124, 134, 5, 54, 28, 2, 125, 134, 5, 36, 19, 2, 126, 134, 5, 10, 6, 2, 127, 134, 5, 60, 31, 2, 128, 134, 5, 62, 32, 2, 129, 134, 5, 66, 34, 2, 130, 134, 5, 68, 35, 2, 131, 134, 5, 94, 48, 2, 132, 134, 5, 70, 36, 2, 133, 120, 3, 2, 2, 2, 133, 121, 3, 2, 2, 2, 133, 122, 3, 2, 2, 2, 133, 123, 3, 2, 2, 2, 133, 124, 3, 2, 2, 2, 133, 125, 3, 2, 2, 2, 133, 126, 3, 2, 2, 2, 133, 127, 3, 2, 2, 2, 133, 128, 3, 2, 2, 2, 133, 129, 3, 2, 2, 2, 133, 130, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 132, 3, 2, 2, 2, 134, 9, 3, 2, 2, 2, 135, 136, 7, 20, 2, 2, 136, 137, 5, 12, 7, 2, 137, 11, 3, 2, 2, 2, 138, 139, 8, 7, 1, 2, 139, 140, 7, 46, 2, 2, 140, 167, 5, 12, 7, 9, 141, 167, 5, 16, 9, 2, 142, 167, 5, 14, 8, 2, 143, 145, 5, 16, 9, 2, 144, 146, 7, 46, 2, 2, 145, 144, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 148, 7, 43, 2, 2, 148, 149, 7, 42, 2, 2, 149, 154, 5, 16, 9, 2, 150, 151, 7, 36, 2, 2, 151, 153, 5, 16, 9, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 157, 3, 2, 2, 2, 156, 154, 3, 2, 2, 2, 157, 158, 7, 52, 2, 2, 158, 167, 3, 2, 2, 2, 159, 160, 5, 16, 9, 2, 160, 162, 7, 44, 2, 2, 161, 163, 7, 46, 2, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 165, 7, 47, 2, 2, 165, 167, 3, 2, 2, 2, 166, 138, 3, 2, 2, 2, 166, 141, 3, 2, 2, 2, 166, 142, 3, 2, 2, 2, 166, 143, 3, 2, 2, 2, 166, 159, 3, 2, 2, 2, 167, 176, 3, 2, 2, 2, 168, 169, 12, 6, 2, 2, 169, 170, 7, 33, 2, 2, 170, 175, 5, 12, 7, 7, 171, 172, 12, 5, 2, 2, 172, 173, 7, 49, 2, 2, 173, 175, 5, 12, 7, 6, 174, 168, 3, 2, 2, 2, 174, 171, 3, 2, 2, 2, 175, 178, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 13, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 181, 5, 16, 9, 2, 180, 182, 7, 46, 2, 2, 181, 180, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 7, 45, 2, 2, 184, 185, 5, 84, 43, 2, 185, 194, 3, 2, 2, 2, 186, 188, 5, 16, 9, 2, 187, 189, 7, 46, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 7, 51, 2, 2, 191, 192, 5, 84, 43, 2, 192, 194, 3, 2, 2, 2, 193, 179, 3, 2, 2, 2, 193, 186, 3, 2, 2, 2, 194, 15, 3, 2, 2, 2, 195, 201, 5, 18, 10, 2, 196, 197, 5, 18, 10, 2, 197, 198, 5, 86, 44, 2, 198, 199, 5, 18, 10, 2, 199, 201, 3, 2, 2, 2, 200, 195, 3, 2, 2, 2, 200, 196, 3, 2, 2, 2, 201, 17, 3, 2, 2, 2, 202, 203, 8, 10, 1, 2, 203, 207, 5, 20, 11, 2, 204, 205, 9, 2, 2, 2, 205, 207, 5, 18, 10, 5, 206, 202, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 216, 3, 2, 2, 2, 208, 209, 12, 4, 2, 2, 209, 210, 9, 3, 2, 2, 210, 215, 5, 18, 10, 5, 211, 212, 12, 3, 2, 2, 212, 213, 9, 2, 2, 2, 213, 215, 5, 18, 10, 4, 214, 208, 3, 2, 2, 2, 214, 211, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 19, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 227, 5, 50, 26, 2, 220, 227, 5, 42, 22, 2, 221, 227, 5, 22, 12, 2, 222, 223, 7, 42, 2, 2, 223, 224, 5, 12, 7, 2, 224, 225, 7, 52, 2, 2, 225, 227, 3, 2, 2, 2, 226, 219, 3, 2, 2, 2, 226, 220, 3, 2, 2, 2, 226, 221, 3, 2, 2, 2, 226, 222, 3, 2, 2, 2, 227, 21, 3, 2, 2, 2, 228, 229, 5, 46, 24, 2, 229, 239, 7, 42, 2, 2, 230, 240, 7, 63, 2, 2, 231, 236, 5, 12, 7, 2, 232, 233, 7, 36, 2, 2, 233, 235, 5, 12, 7, 2, 234, 232, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 240, 3, 2, 2, 2, 238, 236, 3, 2, 2, 2, 239, 230, 3, 2, 2, 2, 239, 231, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 52, 2, 2, 242, 23, 3, 2, 2, 2, 243, 244, 7, 16, 2, 2, 244, 245, 5, 26, 14, 2, 245, 25, 3, 2, 2, 2, 246, 251, 5, 28, 15, 2, 247, 248, 7, 36, 2, 2, 248, 250, 5, 28, 15, 2, 249, 247, 3, 2, 2, 2, 250, 253, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 27, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 254, 260, 5, 12, 7, 2, 255, 256, 5, 42, 22, 2, 256, 257, 7, 35, 2, 2, 257, 258, 5, 12, 7, 2, 258, 260, 3, 2, 2, 2, 259, 254, 3, 2, 2, 2, 259, 255, 3, 2, 2, 2, 260, 29, 3, 2, 2, 2, 261, 262, 7, 8, 2, 2, 262, 267, 5, 40, 21, 2, 263, 264, 7, 36, 2, 2, 264, 266, 5, 40, 21, 2, 265, 263, 3, 2, 2, 2, 266, 269, 3, 2, 2, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 270, 272, 5, 32, 17, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 31, 3, 2, 2, 2, 273, 274, 7, 66, 2, 2, 274, 275, 7, 73, 2, 2, 275, 280, 5, 40, 21, 2, 276, 277, 7, 36, 2, 2, 277, 279, 5, 40, 21, 2, 278, 276, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 284, 7, 67, 2, 2, 284, 33, 3, 2, 2, 2, 285, 286, 7, 6, 2, 2, 286, 287, 5, 26, 14, 2, 287, 35, 3, 2, 2, 2, 288, 290, 7, 19, 2, 2, 289, 291, 5, 26, 14, 2, 290, 289, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 293, 7, 32, 2, 2, 293, 295, 5, 26, 14, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 37, 3, 2, 2, 2, 296, 297, 7, 10, 2, 2, 297, 300, 5, 26, 14, 2, 298, 299, 7, 32, 2, 2, 299, 301, 5, 26, 14, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 39, 3, 2, 2, 2, 302, 303, 9, 4, 2, 2, 303, 41, 3, 2, 2, 2, 304, 309, 5, 46, 24, 2, 305, 306, 7, 38, 2, 2, 306, 308, 5, 46, 24, 2, 307, 305, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 43, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 317, 5, 48, 25, 2, 313, 314, 7, 38, 2, 2, 314, 316, 5, 48, 25, 2, 315, 313, 3, 2, 2, 2, 316, 319, 3, 2, 2, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 45, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 320, 321, 9, 5, 2, 2, 321, 47, 3, 2, 2, 2, 322, 323, 9, 6, 2, 2, 323, 49, 3, 2, 2, 2, 324, 367, 7, 47, 2, 2, 325, 326, 5, 82, 42, 2, 326, 327, 7, 68, 2, 2, 327, 367, 3, 2, 2, 2, 328, 367, 5, 80, 41, 2, 329, 367, 5, 82, 42, 2, 330, 367, 5, 76, 39, 2, 331, 367, 7, 50, 2, 2, 332, 367, 5, 84, 43, 2, 333, 334, 7, 66, 2, 2, 334, 339, 5, 78, 40, 2, 335, 336, 7, 36, 2, 2, 336, 338, 5, 78, 40, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 342, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 343, 7, 67, 2, 2, 343, 367, 3, 2, 2, 2, 344, 345, 7, 66, 2, 2, 345, 350, 5, 76, 39, 2, 346, 347, 7, 36, 2, 2, 347, 349, 5, 76, 39, 2, 348, 346, 3, 2, 2, 2, 349, 352, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 353, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 353, 354, 7, 67, 2, 2, 354, 367, 3, 2, 2, 2, 355, 356, 7, 66, 2, 2, 356, 361, 5, 84, 43, 2, 357, 358, 7, 36, 2, 2, 358, 360, 5, 84, 43, 2, 359, 357, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 364, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 364, 365, 7, 67, 2, 2, 365, 367, 3, 2, 2, 2, 366, 324, 3, 2, 2, 2, 366, 325, 3, 2, 2, 2, 366, 328, 3, 2, 2, 2, 366, 329, 3, 2, 2, 2, 366, 330, 3, 2, 2, 2, 366, 331, 3, 2, 2, 2, 366, 332, 3, 2, 2, 2, 366, 333, 3, 2, 2, 2, 366, 344, 3, 2, 2, 2, 366, 355, 3, 2, 2, 2, 367, 51, 3, 2, 2, 2, 368, 369, 7, 12, 2, 2, 369, 370, 7, 30, 2, 2, 370, 53, 3, 2, 2, 2, 371, 372, 7, 18, 2, 2, 372, 377, 5, 56, 29, 2, 373, 374, 7, 36, 2, 2, 374, 376, 5, 56, 29, 2, 375, 373, 3, 2, 2, 2, 376, 379, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 55, 3, 2, 2, 2, 379, 377, 3, 2, 2, 2, 380, 382, 5, 12, 7, 2, 381, 383, 9, 7, 2, 2, 382, 381, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 385, 7, 48, 2, 2, 385, 387, 9, 8, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 57, 3, 2, 2, 2, 388, 389, 7, 11, 2, 2, 389, 394, 5, 44, 23, 2, 390, 391, 7, 36, 2, 2, 391, 393, 5, 44, 23, 2, 392, 390, 3, 2, 2, 2, 393, 396, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 407, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 398, 7, 14, 2, 2, 398, 403, 5, 44, 23, 2, 399, 400, 7, 36, 2, 2, 400, 402, 5, 44, 23, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 407, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 388, 3, 2, 2, 2, 406, 397, 3, 2, 2, 2, 407, 59, 3, 2, 2, 2, 408, 409, 7, 4, 2, 2, 409, 414, 5, 44, 23, 2, 410, 411, 7, 36, 2, 2, 411, 413, 5, 44, 23, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 61, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 15, 2, 2, 418, 423, 5, 64, 33, 2, 419, 420, 7, 36, 2, 2, 420, 422, 5, 64, 33, 2, 421, 419, 3, 2, 2, 2, 422, 425, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 63, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 426, 427, 5, 44, 23, 2, 427, 428, 7, 82, 2, 2, 428, 429, 5, 44, 23, 2, 429, 65, 3, 2, 2, 2, 430, 431, 7, 3, 2, 2, 431, 432, 5, 20, 11, 2, 432, 434, 5, 84, 43, 2, 433, 435, 5, 72, 37, 2, 434, 433, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 67, 3, 2, 2, 2, 436, 437, 7, 9, 2, 2, 437, 438, 5, 20, 11, 2, 438, 439, 5, 84, 43, 2, 439, 69, 3, 2, 2, 2, 440, 441, 7, 13, 2, 2, 441, 442, 5, 42, 22, 2, 442, 71, 3, 2, 2, 2, 443, 448, 5, 74, 38, 2, 444, 445, 7, 36, 2, 2, 445, 447, 5, 74, 38, 2, 446, 444, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 73, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 452, 5, 46, 24, 2, 452, 453, 7, 35, 2, 2, 453, 454, 5, 50, 26, 2, 454, 75, 3, 2, 2, 2, 455, 456, 9, 9, 2, 2, 456, 77, 3, 2, 2, 2, 457, 460, 5, 80, 41, 2, 458, 460, 5, 82, 42, 2, 459, 457, 3, 2, 2, 2, 459, 458, 3, 2, 2, 2, 460, 79, 3, 2, 2, 2, 461, 463, 9, 2, 2, 2, 462, 461, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 7, 31, 2, 2, 465, 81, 3, 2, 2, 2, 466, 468, 9, 2, 2, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 30, 2, 2, 470, 83, 3, 2, 2, 2, 471, 472, 7, 29, 2, 2, 472, 85, 3, 2, 2, 2, 473, 474, 9, 10, 2, 2, 474, 87, 3, 2, 2, 2, 475, 476, 7, 7, 2, 2, 476, 477, 5, 90, 46, 2, 477, 89, 3, 2, 2, 2, 478, 479, 7, 66, 2, 2, 479, 480, 5, 4, 3, 2, 480, 481, 7, 67, 2, 2, 481, 91, 3, 2, 2, 2, 482, 483, 7, 17, 2, 2, 483, 487, 7, 98, 2, 2, 484, 485, 7, 17, 2, 2, 485, 487, 7, 99, 2, 2, 486, 482, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 487, 93, 3, 2, 2, 2, 488, 492, 7, 5, 2, 2, 489, 491, 5, 98, 50, 2, 490, 489, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 495, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 498, 7, 88, 2, 2, 496, 497, 7, 86, 2, 2, 497, 499, 5, 44, 23, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 509, 3, 2, 2, 2, 500, 501, 7, 87, 2, 2, 501, 506, 5, 96, 49, 2, 502, 503, 7, 36, 2, 2, 503, 505, 5, 96, 49, 2, 504, 502, 3, 2, 2, 2, 505, 508, 3, 2, 2, 2, 506, 504, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 509, 500, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 95, 3, 2, 2, 2, 511, 512, 5, 44, 23, 2, 512, 513, 7, 35, 2, 2, 513, 515, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 5, 44, 23, 2, 517, 97, 3, 2, 2, 2, 518, 519, 7, 66, 2, 2, 519, 520, 7, 104, 2, 2, 520, 521, 7, 103, 2, 2, 521, 522, 7, 104, 2, 2, 522, 523, 7, 67, 2, 2, 523, 99, 3, 2, 2, 2, 54, 111, 118, 133, 145, 154, 162, 166, 174, 176, 181, 188, 193, 200, 206, 214, 216, 226, 236, 239, 251, 259, 267, 271, 280, 290, 294, 300, 309, 317, 339, 350, 361, 366, 377, 382, 386, 394, 403, 406, 414, 423, 434, 448, 459, 462, 467, 486, 492, 498, 506, 509, 514] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens index 073febb9e1783..4bdf0572a3b8a 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens @@ -50,58 +50,59 @@ RLIKE=49 RP=50 TRUE=51 EQ=52 -NEQ=53 -LT=54 -LTE=55 -GT=56 -GTE=57 -PLUS=58 -MINUS=59 -ASTERISK=60 -SLASH=61 -PERCENT=62 -OPENING_BRACKET=63 -CLOSING_BRACKET=64 -UNQUOTED_IDENTIFIER=65 -QUOTED_IDENTIFIER=66 -EXPR_LINE_COMMENT=67 -EXPR_MULTILINE_COMMENT=68 -EXPR_WS=69 -METADATA=70 -FROM_UNQUOTED_IDENTIFIER=71 -FROM_LINE_COMMENT=72 -FROM_MULTILINE_COMMENT=73 -FROM_WS=74 -UNQUOTED_ID_PATTERN=75 -PROJECT_LINE_COMMENT=76 -PROJECT_MULTILINE_COMMENT=77 -PROJECT_WS=78 -AS=79 -RENAME_LINE_COMMENT=80 -RENAME_MULTILINE_COMMENT=81 -RENAME_WS=82 -ON=83 -WITH=84 -ENRICH_POLICY_NAME=85 -ENRICH_LINE_COMMENT=86 -ENRICH_MULTILINE_COMMENT=87 -ENRICH_WS=88 -ENRICH_FIELD_LINE_COMMENT=89 -ENRICH_FIELD_MULTILINE_COMMENT=90 -ENRICH_FIELD_WS=91 -MVEXPAND_LINE_COMMENT=92 -MVEXPAND_MULTILINE_COMMENT=93 -MVEXPAND_WS=94 -INFO=95 -FUNCTIONS=96 -SHOW_LINE_COMMENT=97 -SHOW_MULTILINE_COMMENT=98 -SHOW_WS=99 -COLON=100 -SETTING=101 -SETTING_LINE_COMMENT=102 -SETTTING_MULTILINE_COMMENT=103 -SETTING_WS=104 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +OPENING_BRACKET=64 +CLOSING_BRACKET=65 +UNQUOTED_IDENTIFIER=66 +QUOTED_IDENTIFIER=67 +EXPR_LINE_COMMENT=68 +EXPR_MULTILINE_COMMENT=69 +EXPR_WS=70 +METADATA=71 +FROM_UNQUOTED_IDENTIFIER=72 +FROM_LINE_COMMENT=73 +FROM_MULTILINE_COMMENT=74 +FROM_WS=75 +UNQUOTED_ID_PATTERN=76 +PROJECT_LINE_COMMENT=77 +PROJECT_MULTILINE_COMMENT=78 +PROJECT_WS=79 +AS=80 +RENAME_LINE_COMMENT=81 +RENAME_MULTILINE_COMMENT=82 +RENAME_WS=83 +ON=84 +WITH=85 +ENRICH_POLICY_NAME=86 +ENRICH_LINE_COMMENT=87 +ENRICH_MULTILINE_COMMENT=88 +ENRICH_WS=89 +ENRICH_FIELD_LINE_COMMENT=90 +ENRICH_FIELD_MULTILINE_COMMENT=91 +ENRICH_FIELD_WS=92 +MVEXPAND_LINE_COMMENT=93 +MVEXPAND_MULTILINE_COMMENT=94 +MVEXPAND_WS=95 +INFO=96 +FUNCTIONS=97 +SHOW_LINE_COMMENT=98 +SHOW_MULTILINE_COMMENT=99 +SHOW_WS=100 +COLON=101 +SETTING=102 +SETTING_LINE_COMMENT=103 +SETTTING_MULTILINE_COMMENT=104 +SETTING_WS=105 '|'=26 '='=33 ','=34 @@ -110,15 +111,16 @@ SETTING_WS=104 '?'=48 ')'=50 '=='=52 -'!='=53 -'<'=54 -'<='=55 -'>'=56 -'>='=57 -'+'=58 -'-'=59 -'*'=60 -'/'=61 -'%'=62 -']'=64 -':'=100 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 +']'=65 +':'=101 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts index d4d52d328b189..696d67ba90f00 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts @@ -79,58 +79,59 @@ export class esql_parser extends Parser { public static readonly RP = 50; public static readonly TRUE = 51; public static readonly EQ = 52; - public static readonly NEQ = 53; - public static readonly LT = 54; - public static readonly LTE = 55; - public static readonly GT = 56; - public static readonly GTE = 57; - public static readonly PLUS = 58; - public static readonly MINUS = 59; - public static readonly ASTERISK = 60; - public static readonly SLASH = 61; - public static readonly PERCENT = 62; - public static readonly OPENING_BRACKET = 63; - public static readonly CLOSING_BRACKET = 64; - public static readonly UNQUOTED_IDENTIFIER = 65; - public static readonly QUOTED_IDENTIFIER = 66; - public static readonly EXPR_LINE_COMMENT = 67; - public static readonly EXPR_MULTILINE_COMMENT = 68; - public static readonly EXPR_WS = 69; - public static readonly METADATA = 70; - public static readonly FROM_UNQUOTED_IDENTIFIER = 71; - public static readonly FROM_LINE_COMMENT = 72; - public static readonly FROM_MULTILINE_COMMENT = 73; - public static readonly FROM_WS = 74; - public static readonly UNQUOTED_ID_PATTERN = 75; - public static readonly PROJECT_LINE_COMMENT = 76; - public static readonly PROJECT_MULTILINE_COMMENT = 77; - public static readonly PROJECT_WS = 78; - public static readonly AS = 79; - public static readonly RENAME_LINE_COMMENT = 80; - public static readonly RENAME_MULTILINE_COMMENT = 81; - public static readonly RENAME_WS = 82; - public static readonly ON = 83; - public static readonly WITH = 84; - public static readonly ENRICH_POLICY_NAME = 85; - public static readonly ENRICH_LINE_COMMENT = 86; - public static readonly ENRICH_MULTILINE_COMMENT = 87; - public static readonly ENRICH_WS = 88; - public static readonly ENRICH_FIELD_LINE_COMMENT = 89; - public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 90; - public static readonly ENRICH_FIELD_WS = 91; - public static readonly MVEXPAND_LINE_COMMENT = 92; - public static readonly MVEXPAND_MULTILINE_COMMENT = 93; - public static readonly MVEXPAND_WS = 94; - public static readonly INFO = 95; - public static readonly FUNCTIONS = 96; - public static readonly SHOW_LINE_COMMENT = 97; - public static readonly SHOW_MULTILINE_COMMENT = 98; - public static readonly SHOW_WS = 99; - public static readonly COLON = 100; - public static readonly SETTING = 101; - public static readonly SETTING_LINE_COMMENT = 102; - public static readonly SETTTING_MULTILINE_COMMENT = 103; - public static readonly SETTING_WS = 104; + public static readonly CIEQ = 53; + public static readonly NEQ = 54; + public static readonly LT = 55; + public static readonly LTE = 56; + public static readonly GT = 57; + public static readonly GTE = 58; + public static readonly PLUS = 59; + public static readonly MINUS = 60; + public static readonly ASTERISK = 61; + public static readonly SLASH = 62; + public static readonly PERCENT = 63; + public static readonly OPENING_BRACKET = 64; + public static readonly CLOSING_BRACKET = 65; + public static readonly UNQUOTED_IDENTIFIER = 66; + public static readonly QUOTED_IDENTIFIER = 67; + public static readonly EXPR_LINE_COMMENT = 68; + public static readonly EXPR_MULTILINE_COMMENT = 69; + public static readonly EXPR_WS = 70; + public static readonly METADATA = 71; + public static readonly FROM_UNQUOTED_IDENTIFIER = 72; + public static readonly FROM_LINE_COMMENT = 73; + public static readonly FROM_MULTILINE_COMMENT = 74; + public static readonly FROM_WS = 75; + public static readonly UNQUOTED_ID_PATTERN = 76; + public static readonly PROJECT_LINE_COMMENT = 77; + public static readonly PROJECT_MULTILINE_COMMENT = 78; + public static readonly PROJECT_WS = 79; + public static readonly AS = 80; + public static readonly RENAME_LINE_COMMENT = 81; + public static readonly RENAME_MULTILINE_COMMENT = 82; + public static readonly RENAME_WS = 83; + public static readonly ON = 84; + public static readonly WITH = 85; + public static readonly ENRICH_POLICY_NAME = 86; + public static readonly ENRICH_LINE_COMMENT = 87; + public static readonly ENRICH_MULTILINE_COMMENT = 88; + public static readonly ENRICH_WS = 89; + public static readonly ENRICH_FIELD_LINE_COMMENT = 90; + public static readonly ENRICH_FIELD_MULTILINE_COMMENT = 91; + public static readonly ENRICH_FIELD_WS = 92; + public static readonly MVEXPAND_LINE_COMMENT = 93; + public static readonly MVEXPAND_MULTILINE_COMMENT = 94; + public static readonly MVEXPAND_WS = 95; + public static readonly INFO = 96; + public static readonly FUNCTIONS = 97; + public static readonly SHOW_LINE_COMMENT = 98; + public static readonly SHOW_MULTILINE_COMMENT = 99; + public static readonly SHOW_WS = 100; + public static readonly COLON = 101; + public static readonly SETTING = 102; + public static readonly SETTING_LINE_COMMENT = 103; + public static readonly SETTTING_MULTILINE_COMMENT = 104; + public static readonly SETTING_WS = 105; public static readonly RULE_singleStatement = 0; public static readonly RULE_query = 1; public static readonly RULE_sourceCommand = 2; @@ -203,13 +204,13 @@ export class esql_parser extends Parser { undefined, undefined, undefined, undefined, undefined, "'='", "','", undefined, "'.'", undefined, undefined, undefined, "'('", undefined, undefined, undefined, undefined, undefined, undefined, undefined, "'?'", undefined, "')'", undefined, - "'=='", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", - "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, + "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'/'", "'%'", undefined, "']'", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, "':'", + undefined, undefined, undefined, "':'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", @@ -219,8 +220,8 @@ export class esql_parser extends Parser { "PIPE", "STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "LAST", "LP", "IN", "IS", "LIKE", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", - "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", - "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", + "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "FROM_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "UNQUOTED_ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", @@ -940,7 +941,7 @@ export class esql_parser extends Parser { this.state = 207; (_localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & ((1 << (esql_parser.ASTERISK - 60)) | (1 << (esql_parser.SLASH - 60)) | (1 << (esql_parser.PERCENT - 60)))) !== 0))) { + if (!(((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (esql_parser.ASTERISK - 61)) | (1 << (esql_parser.SLASH - 61)) | (1 << (esql_parser.PERCENT - 61)))) !== 0))) { (_localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2566,7 +2567,7 @@ export class esql_parser extends Parser { { this.state = 471; _la = this._input.LA(1); - if (!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & ((1 << (esql_parser.EQ - 52)) | (1 << (esql_parser.NEQ - 52)) | (1 << (esql_parser.LT - 52)) | (1 << (esql_parser.LTE - 52)) | (1 << (esql_parser.GT - 52)) | (1 << (esql_parser.GTE - 52)))) !== 0))) { + if (!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & ((1 << (esql_parser.EQ - 52)) | (1 << (esql_parser.CIEQ - 52)) | (1 << (esql_parser.NEQ - 52)) | (1 << (esql_parser.LT - 52)) | (1 << (esql_parser.LTE - 52)) | (1 << (esql_parser.GT - 52)) | (1 << (esql_parser.GTE - 52)))) !== 0))) { this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2891,7 +2892,7 @@ export class esql_parser extends Parser { } public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03j\u020D\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03k\u020D\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -2948,9 +2949,9 @@ export class esql_parser extends Parser { "\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02" + " \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02" + "<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02" + - "X\x02Z\x02\\\x02^\x02`\x02b\x02\x02\v\x03\x02<=\x03\x02>@\x04\x02DDII" + - "\x03\x02CD\x04\x02DDMM\x04\x02\"\"%%\x03\x02()\x04\x02\'\'55\x03\x026" + - ";\x02\u022A\x02d\x03\x02\x02\x02\x04g\x03\x02\x02\x02\x06v\x03\x02\x02" + + "X\x02Z\x02\\\x02^\x02`\x02b\x02\x02\v\x03\x02=>\x03\x02?A\x04\x02EEJJ" + + "\x03\x02DE\x04\x02EENN\x04\x02\"\"%%\x03\x02()\x04\x02\'\'55\x03\x026" + + "<\x02\u022A\x02d\x03\x02\x02\x02\x04g\x03\x02\x02\x02\x06v\x03\x02\x02" + "\x02\b\x85\x03\x02\x02\x02\n\x87\x03\x02\x02\x02\f\xA6\x03\x02\x02\x02" + "\x0E\xC1\x03\x02\x02\x02\x10\xC8\x03\x02\x02\x02\x12\xCE\x03\x02\x02\x02" + "\x14\xE2\x03\x02\x02\x02\x16\xE4\x03\x02\x02\x02\x18\xF3\x03\x02\x02\x02" + @@ -3016,7 +3017,7 @@ export class esql_parser extends Parser { "\x16\f\x02\xDE\xDF\x07*\x02\x02\xDF\xE0\x05\f\x07\x02\xE0\xE1\x074\x02" + "\x02\xE1\xE3\x03\x02\x02\x02\xE2\xDB\x03\x02\x02\x02\xE2\xDC\x03\x02\x02" + "\x02\xE2\xDD\x03\x02\x02\x02\xE2\xDE\x03\x02\x02\x02\xE3\x15\x03\x02\x02" + - "\x02\xE4\xE5\x05.\x18\x02\xE5\xEF\x07*\x02\x02\xE6\xF0\x07>\x02\x02\xE7" + + "\x02\xE4\xE5\x05.\x18\x02\xE5\xEF\x07*\x02\x02\xE6\xF0\x07?\x02\x02\xE7" + "\xEC\x05\f\x07\x02\xE8\xE9\x07$\x02\x02\xE9\xEB\x05\f\x07\x02\xEA\xE8" + "\x03\x02\x02\x02\xEB\xEE\x03\x02\x02\x02\xEC\xEA\x03\x02\x02\x02\xEC\xED" + "\x03\x02\x02\x02\xED\xF0\x03\x02\x02\x02\xEE\xEC\x03\x02\x02\x02\xEF\xE6" + @@ -3034,11 +3035,11 @@ export class esql_parser extends Parser { "\x03\x02\x02\x02\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02\x02\x02" + "\u010D\u010B\x03\x02\x02\x02\u010E\u0110\x05 \x11\x02\u010F\u010E\x03" + "\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\x1F\x03\x02\x02\x02\u0111" + - "\u0112\x07A\x02\x02\u0112\u0113\x07H\x02\x02\u0113\u0118\x05(\x15\x02" + + "\u0112\x07B\x02\x02\u0112\u0113\x07I\x02\x02\u0113\u0118\x05(\x15\x02" + "\u0114\u0115\x07$\x02\x02\u0115\u0117\x05(\x15\x02\u0116\u0114\x03\x02" + "\x02\x02\u0117\u011A\x03\x02\x02\x02\u0118\u0116\x03\x02\x02\x02\u0118" + "\u0119\x03\x02\x02\x02\u0119\u011B\x03\x02\x02\x02\u011A\u0118\x03\x02" + - "\x02\x02\u011B\u011C\x07B\x02\x02\u011C!\x03\x02\x02\x02\u011D\u011E\x07" + + "\x02\x02\u011B\u011C\x07C\x02\x02\u011C!\x03\x02\x02\x02\u011D\u011E\x07" + "\x06\x02\x02\u011E\u011F\x05\x1A\x0E\x02\u011F#\x03\x02\x02\x02\u0120" + "\u0122\x07\x13\x02\x02\u0121\u0123\x05\x1A\x0E\x02\u0122\u0121\x03\x02" + "\x02\x02\u0122\u0123\x03\x02\x02\x02\u0123\u0126\x03\x02\x02\x02\u0124" + @@ -3056,22 +3057,22 @@ export class esql_parser extends Parser { "\x02\x02\u013E-\x03\x02\x02\x02\u013F\u013D\x03\x02\x02\x02\u0140\u0141" + "\t\x05\x02\x02\u0141/\x03\x02\x02\x02\u0142\u0143\t\x06\x02\x02\u0143" + "1\x03\x02\x02\x02\u0144\u016F\x07/\x02\x02\u0145\u0146\x05R*\x02\u0146" + - "\u0147\x07C\x02\x02\u0147\u016F\x03\x02\x02\x02\u0148\u016F\x05P)\x02" + + "\u0147\x07D\x02\x02\u0147\u016F\x03\x02\x02\x02\u0148\u016F\x05P)\x02" + "\u0149\u016F\x05R*\x02\u014A\u016F\x05L\'\x02\u014B\u016F\x072\x02\x02" + - "\u014C\u016F\x05T+\x02\u014D\u014E\x07A\x02\x02\u014E\u0153\x05N(\x02" + + "\u014C\u016F\x05T+\x02\u014D\u014E\x07B\x02\x02\u014E\u0153\x05N(\x02" + "\u014F\u0150\x07$\x02\x02\u0150\u0152\x05N(\x02\u0151\u014F\x03\x02\x02" + "\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03\x02\x02\x02\u0153\u0154" + "\x03\x02\x02\x02\u0154\u0156\x03\x02\x02\x02\u0155\u0153\x03\x02\x02\x02" + - "\u0156\u0157\x07B\x02\x02\u0157\u016F\x03\x02\x02\x02\u0158\u0159\x07" + - "A\x02\x02\u0159\u015E\x05L\'\x02\u015A\u015B\x07$\x02\x02\u015B\u015D" + + "\u0156\u0157\x07C\x02\x02\u0157\u016F\x03\x02\x02\x02\u0158\u0159\x07" + + "B\x02\x02\u0159\u015E\x05L\'\x02\u015A\u015B\x07$\x02\x02\u015B\u015D" + "\x05L\'\x02\u015C\u015A\x03\x02\x02\x02\u015D\u0160\x03\x02\x02\x02\u015E" + "\u015C\x03\x02\x02\x02\u015E\u015F\x03\x02\x02\x02\u015F\u0161\x03\x02" + - "\x02\x02\u0160\u015E\x03\x02\x02\x02\u0161\u0162\x07B\x02\x02\u0162\u016F" + - "\x03\x02\x02\x02\u0163\u0164\x07A\x02\x02\u0164\u0169\x05T+\x02\u0165" + + "\x02\x02\u0160\u015E\x03\x02\x02\x02\u0161\u0162\x07C\x02\x02\u0162\u016F" + + "\x03\x02\x02\x02\u0163\u0164\x07B\x02\x02\u0164\u0169\x05T+\x02\u0165" + "\u0166\x07$\x02\x02\u0166\u0168\x05T+\x02\u0167\u0165\x03\x02\x02\x02" + "\u0168\u016B\x03\x02\x02\x02\u0169\u0167\x03\x02\x02\x02\u0169\u016A\x03" + "\x02\x02\x02\u016A\u016C\x03\x02\x02\x02\u016B\u0169\x03\x02\x02\x02\u016C" + - "\u016D\x07B\x02\x02\u016D\u016F\x03\x02\x02\x02\u016E\u0144\x03\x02\x02" + + "\u016D\x07C\x02\x02\u016D\u016F\x03\x02\x02\x02\u016E\u0144\x03\x02\x02" + "\x02\u016E\u0145\x03\x02\x02\x02\u016E\u0148\x03\x02\x02\x02\u016E\u0149" + "\x03\x02\x02\x02\u016E\u014A\x03\x02\x02\x02\u016E\u014B\x03\x02\x02\x02" + "\u016E\u014C\x03\x02\x02\x02\u016E\u014D\x03\x02\x02\x02\u016E\u0158\x03" + @@ -3101,7 +3102,7 @@ export class esql_parser extends Parser { "$\x02\x02\u01A4\u01A6\x05@!\x02\u01A5\u01A3\x03\x02\x02\x02\u01A6\u01A9" + "\x03\x02\x02\x02\u01A7\u01A5\x03\x02\x02\x02\u01A7\u01A8\x03\x02\x02\x02" + "\u01A8?\x03\x02\x02\x02\u01A9\u01A7\x03\x02\x02\x02\u01AA\u01AB\x05,\x17" + - "\x02\u01AB\u01AC\x07Q\x02\x02\u01AC\u01AD\x05,\x17\x02\u01ADA\x03\x02" + + "\x02\u01AB\u01AC\x07R\x02\x02\u01AC\u01AD\x05,\x17\x02\u01ADA\x03\x02" + "\x02\x02\u01AE\u01AF\x07\x03\x02\x02\u01AF\u01B0\x05\x14\v\x02\u01B0\u01B2" + "\x05T+\x02\u01B1\u01B3\x05H%\x02\u01B2\u01B1\x03\x02\x02\x02\u01B2\u01B3" + "\x03\x02\x02\x02\u01B3C\x03\x02\x02\x02\u01B4\u01B5\x07\t\x02\x02\u01B5" + @@ -3121,16 +3122,16 @@ export class esql_parser extends Parser { "\x02\x02\u01D6S\x03\x02\x02\x02\u01D7\u01D8\x07\x1D\x02\x02\u01D8U\x03" + "\x02\x02\x02\u01D9\u01DA\t\n\x02\x02\u01DAW\x03\x02\x02\x02\u01DB\u01DC" + "\x07\x07\x02\x02\u01DC\u01DD\x05Z.\x02\u01DDY\x03\x02\x02\x02\u01DE\u01DF" + - "\x07A\x02\x02\u01DF\u01E0\x05\x04\x03\x02\u01E0\u01E1\x07B\x02\x02\u01E1" + - "[\x03\x02\x02\x02\u01E2\u01E3\x07\x11\x02\x02\u01E3\u01E7\x07a\x02\x02" + - "\u01E4\u01E5\x07\x11\x02\x02\u01E5\u01E7\x07b\x02\x02\u01E6\u01E2\x03" + + "\x07B\x02\x02\u01DF\u01E0\x05\x04\x03\x02\u01E0\u01E1\x07C\x02\x02\u01E1" + + "[\x03\x02\x02\x02\u01E2\u01E3\x07\x11\x02\x02\u01E3\u01E7\x07b\x02\x02" + + "\u01E4\u01E5\x07\x11\x02\x02\u01E5\u01E7\x07c\x02\x02\u01E6\u01E2\x03" + "\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02\u01E7]\x03\x02\x02\x02\u01E8" + "\u01EC\x07\x05\x02\x02\u01E9\u01EB\x05b2\x02\u01EA\u01E9\x03\x02\x02\x02" + "\u01EB\u01EE\x03\x02\x02\x02\u01EC\u01EA\x03\x02\x02\x02\u01EC\u01ED\x03" + "\x02\x02\x02\u01ED\u01EF\x03\x02\x02\x02\u01EE\u01EC\x03\x02\x02\x02\u01EF" + - "\u01F2\x07W\x02\x02\u01F0\u01F1\x07U\x02\x02\u01F1\u01F3\x05,\x17\x02" + + "\u01F2\x07X\x02\x02\u01F0\u01F1\x07V\x02\x02\u01F1\u01F3\x05,\x17\x02" + "\u01F2\u01F0\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01FD\x03" + - "\x02\x02\x02\u01F4\u01F5\x07V\x02\x02\u01F5\u01FA\x05`1\x02\u01F6\u01F7" + + "\x02\x02\x02\u01F4\u01F5\x07W\x02\x02\u01F5\u01FA\x05`1\x02\u01F6\u01F7" + "\x07$\x02\x02\u01F7\u01F9\x05`1\x02\u01F8\u01F6\x03\x02\x02\x02\u01F9" + "\u01FC\x03\x02\x02\x02\u01FA\u01F8\x03\x02\x02\x02\u01FA\u01FB\x03\x02" + "\x02\x02\u01FB\u01FE\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD" + @@ -3138,8 +3139,8 @@ export class esql_parser extends Parser { "\x02\u01FF\u0200\x05,\x17\x02\u0200\u0201\x07#\x02\x02\u0201\u0203\x03" + "\x02\x02\x02\u0202\u01FF\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203" + "\u0204\x03\x02\x02\x02\u0204\u0205\x05,\x17\x02\u0205a\x03\x02\x02\x02" + - "\u0206\u0207\x07A\x02\x02\u0207\u0208\x07g\x02\x02\u0208\u0209\x07f\x02" + - "\x02\u0209\u020A\x07g\x02\x02\u020A\u020B\x07B\x02\x02\u020Bc\x03\x02" + + "\u0206\u0207\x07B\x02\x02\u0207\u0208\x07h\x02\x02\u0208\u0209\x07g\x02" + + "\x02\u0209\u020A\x07h\x02\x02\u020A\u020B\x07C\x02\x02\u020Bc\x03\x02" + "\x02\x026ov\x85\x91\x9A\xA2\xA6\xAE\xB0\xB5\xBC\xC1\xC8\xCE\xD6\xD8\xE2" + "\xEC\xEF\xFB\u0103\u010B\u010F\u0118\u0122\u0126\u012C\u0135\u013D\u0153" + "\u015E\u0169\u016E\u0179\u017E\u0182\u018A\u0193\u0196\u019E\u01A7\u01B2" + @@ -5068,6 +5069,7 @@ export class StringContext extends ParserRuleContext { export class ComparisonOperatorContext extends ParserRuleContext { public EQ(): TerminalNode | undefined { return this.tryGetToken(esql_parser.EQ, 0); } + public CIEQ(): TerminalNode | undefined { return this.tryGetToken(esql_parser.CIEQ, 0); } public NEQ(): TerminalNode | undefined { return this.tryGetToken(esql_parser.NEQ, 0); } public LT(): TerminalNode | undefined { return this.tryGetToken(esql_parser.LT, 0); } public LTE(): TerminalNode | undefined { return this.tryGetToken(esql_parser.LTE, 0); } diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts b/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts index d972b76b1c207..8c9682a24f202 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/ast_helpers.ts @@ -191,15 +191,15 @@ export function computeLocationExtends(fn: ESQLFunction) { /* SCRIPT_MARKER_START */ function getQuotedText(ctx: ParserRuleContext) { - return [66 /* esql_parser.QUOTED_IDENTIFIER */] + return [67 /* esql_parser.QUOTED_IDENTIFIER */] .map((keyCode) => ctx.tryGetToken(keyCode, 0)) .filter(nonNullable)[0]; } function getUnquotedText(ctx: ParserRuleContext) { return [ - 65 /* esql_parser.UNQUOTED_IDENTIFIER */, 71 /* esql_parser.FROM_UNQUOTED_IDENTIFIER */, - 75 /* esql_parser.UNQUOTED_ID_PATTERN */, + 66 /* esql_parser.UNQUOTED_IDENTIFIER */, 72 /* esql_parser.FROM_UNQUOTED_IDENTIFIER */, + 76 /* esql_parser.UNQUOTED_ID_PATTERN */, ] .map((keyCode) => ctx.tryGetToken(keyCode, 0)) .filter(nonNullable)[0]; diff --git a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts b/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts index 7e63d8d0bc9f0..0a5bffa5a3067 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/ast_walker.ts @@ -233,6 +233,7 @@ function getMathOperation(ctx: ArithmeticBinaryContext) { function getComparisonName(ctx: ComparisonOperatorContext) { return ( ctx.EQ()?.text || + ctx.CIEQ()?.text || ctx.NEQ()?.text || ctx.LT()?.text || ctx.LTE()?.text || diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts index 9967b213cffdb..12a1db12392d5 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts @@ -349,6 +349,10 @@ describe('autocomplete', () => { ...getFieldNamesByType('string'), ...getFunctionSignaturesByReturnType('where', 'string', { evalMath: true }), ]); + testSuggestions('from a | where stringField =~ ', [ + ...getFieldNamesByType('string'), + ...getFunctionSignaturesByReturnType('where', 'string', { evalMath: true }), + ]); testSuggestions('from a | where stringField >= stringField ', [ ...getFunctionSignaturesByReturnType( 'where', @@ -360,6 +364,17 @@ describe('autocomplete', () => { ), '|', ]); + testSuggestions('from a | where stringField =~ stringField ', [ + ...getFunctionSignaturesByReturnType( + 'where', + 'boolean', + { + builtin: true, + }, + ['boolean'] + ), + '|', + ]); for (const op of ['and', 'or']) { testSuggestions(`from a | where stringField >= stringField ${op} `, [ ...getFieldNamesByType('any'), @@ -615,6 +630,10 @@ describe('autocomplete', () => { ...getFunctionSignaturesByReturnType('eval', 'any', { evalMath: true }), 'a', ]); + testSuggestions('from a | eval a=stringField =~ ', [ + ...getFieldNamesByType('string'), + ...getFunctionSignaturesByReturnType('eval', 'string', { evalMath: true }), + ]); testSuggestions( 'from a | eval a=round()', [ diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts index b4c8d5b72d388..80fdb22ee207a 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.ts @@ -21,11 +21,14 @@ import { isAssignment, isAssignmentComplete, isColumnItem, + isComma, isFunctionItem, isIncompleteItem, isLiteralItem, + isMathFunction, isOptionItem, isRestartingExpression, + isSourceCommand, isSettingItem, isSourceItem, isTimeIntervalItem, @@ -116,17 +119,6 @@ function getFinalSuggestions({ comma }: { comma?: boolean } = { comma: true }) { return finalSuggestions; } -function isMathFunction(char: string) { - return ['+', '-', '*', '/', '%', '='].some((op) => char === op); -} - -function isComma(char: string) { - return char === ','; -} - -function isSourceCommand({ label }: AutocompleteCommandDefinition) { - return ['from', 'row', 'show'].includes(String(label)); -} /** * This function count the number of unclosed brackets in order to * locally fix the queryString to generate a valid AST diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts index e54753c55ec06..8894e221143dd 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/definitions/builtin.ts @@ -186,6 +186,13 @@ export const builtinFunctions: FunctionDefinition[] = [ }, ].map((op) => createComparisonDefinition(op)), ...[ + // new special comparison operator for strings only + { + name: '=~', + description: i18n.translate('monaco.esql.definition.equalToCaseInsensitiveDoc', { + defaultMessage: 'Case insensitive equality', + }), + }, { name: 'like', description: i18n.translate('monaco.esql.definition.likeDoc', { diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts b/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts index f7dcb9fdb5f1e..0056689b524e9 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/shared/helpers.ts @@ -7,6 +7,7 @@ */ import type { monaco } from '../../../../monaco_imports'; +import { AutocompleteCommandDefinition } from '../autocomplete/types'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import { builtinFunctions } from '../definitions/builtin'; import { commandDefinitions } from '../definitions/commands'; @@ -91,6 +92,23 @@ export function isIncompleteItem(arg: ESQLAstItem): boolean { return !arg || (!Array.isArray(arg) && arg.incomplete); } +export function isMathFunction(char: string) { + // compare last char for all math functions + // limit only to 2 chars operators + return builtinFunctions + .filter(({ name }) => name.length < 3) + .map(({ name }) => name[name.length - 1]) + .some((op) => char === op); +} + +export function isComma(char: string) { + return char === ','; +} + +export function isSourceCommand({ label }: AutocompleteCommandDefinition) { + return ['from', 'row', 'show'].includes(String(label)); +} + // From Monaco position to linear offset export function monacoPositionToOffset(expression: string, position: monaco.Position): number { const lines = expression.split(/\n/); diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts index ce822de4cd186..1f7ea3750b3bd 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts @@ -779,6 +779,30 @@ describe('validation logic', () => { `Argument of [${op}] must be [number], found value [stringField] type [string]`, ]); } + testErrorsAndWarnings(`from a | where numberField =~ 0`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where NOT numberField =~ 0`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where (numberField =~ 0)`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where (NOT (numberField =~ 0))`, [ + 'Argument of [=~] must be [string], found value [numberField] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | where 1 =~ 0`, [ + 'Argument of [=~] must be [string], found value [1] type [number]', + 'Argument of [=~] must be [string], found value [0] type [number]', + ]); + testErrorsAndWarnings(`from a | eval stringField =~ 0`, [ + `Argument of [=~] must be [string], found value [0] type [number]`, + ]); + for (const op of ['like', 'rlike']) { testErrorsAndWarnings(`from a | where stringField ${op} "?a"`, []); testErrorsAndWarnings(`from a | where stringField NOT ${op} "?a"`, []); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts index 396577d46cd72..6190c36c7396d 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/list_operator/index.ts @@ -15,6 +15,15 @@ export enum ListOperatorEnum { EXCLUDED = 'excluded', } +export const listOperatorType = t.keyof({ + nested: null, + match: null, + match_any: null, + wildcard: null, + exists: null, + list: null, +}); +export type ListOperatorType = t.TypeOf; export enum ListOperatorTypeEnum { NESTED = 'nested', MATCH = 'match', diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx index 60479eeb6e647..2147df7af05ac 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx @@ -339,7 +339,7 @@ export const UnifiedFieldListSidebarComponent: React.FC = { + const buttonAddFieldCommonProps: Partial> = { size: 's', iconType: 'indexOpen', 'data-test-subj': diff --git a/packages/presentation/presentation_publishing/interfaces/has_type.ts b/packages/presentation/presentation_publishing/interfaces/has_type.ts index b608dd4ed2ba6..4957ce520a0f5 100644 --- a/packages/presentation/presentation_publishing/interfaces/has_type.ts +++ b/packages/presentation/presentation_publishing/interfaces/has_type.ts @@ -21,7 +21,7 @@ export const apiHasType = (api: unknown | null): api is HasType => { export const apiIsOfType = ( api: unknown | null, - typeToCheck: string + typeToCheck: T ): api is HasType => { return Boolean(api && (api as HasType).type) && (api as HasType).type === typeToCheck; }; diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh index bdc51d09a2aa5..1a8e27704c53c 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh @@ -84,7 +84,7 @@ case $1 in if [ "$1" = "2" ]; then IS_UPGRADE=true fi - + PACKAGE=rpm setup ;; @@ -115,6 +115,5 @@ if [ "$PACKAGE" = "deb" ]; then /usr/share/kibana/bin/kibana-keystore create chown root:<%= group %> "${KBN_PATH_CONF}"/kibana.keystore chmod 660 "${KBN_PATH_CONF}"/kibana.keystore - md5sum "${KBN_PATH_CONF}"/kibana.keystore > "${KBN_PATH_CONF}"/.kibana.keystore.initial_md5sum fi fi diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh b/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh index 7e587e26ffa9e..65ebdf0174452 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_remove.sh @@ -3,6 +3,7 @@ set -e REMOVE_DIRS=false REMOVE_USER_AND_GROUP=false +REMOVE_KEYSTORE=false case $1 in # Includes cases for all valid arguments, exit 1 otherwise @@ -10,6 +11,7 @@ case $1 in purge) REMOVE_DIRS=true REMOVE_USER_AND_GROUP=true + REMOVE_KEYSTORE=true ;; remove) REMOVE_DIRS=true @@ -21,6 +23,7 @@ case $1 in # Red Hat 0) REMOVE_USER_AND_GROUP=true + REMOVE_KEYSTORE=true REMOVE_DIRS=true ;; @@ -53,6 +56,14 @@ if [ "$REMOVE_DIRS" = "true" ]; then echo " OK" fi + if [ "$REMOVE_KEYSTORE" = "true" ]; then + if [ -e "<%= configDir %>/kibana.keystore" ]; then + echo -n "Deleting kibana.keystore..." + rm -f "<%= configDir %>/kibana.keystore" + echo "OK" + fi + fi + if [ -d "<%= configDir %>" ]; then rmdir --ignore-fail-on-non-empty "<%= configDir %>" fi diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh b/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh index 3c1bd3ccf88b4..ea9289983543f 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_trans.sh @@ -4,5 +4,4 @@ if [ ! -f "${KBN_PATH_CONF}"/kibana.keystore ]; then /usr/share/kibana/bin/kibana-keystore create chown root:<%= group %> "${KBN_PATH_CONF}"/kibana.keystore chmod 660 "${KBN_PATH_CONF}"/kibana.keystore - md5sum "${KBN_PATH_CONF}"/kibana.keystore > "${KBN_PATH_CONF}"/.kibana.keystore.initial_md5sum fi diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index e171747874c2e..436fc25abf955 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -85,7 +85,7 @@ 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@8.5.1': ['Elastic License 2.0'], - '@elastic/eui@92.1.1': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@92.2.1': ['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 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/src/plugins/controls/public/options_list/components/options_list.scss b/src/plugins/controls/public/options_list/components/options_list.scss index e0c749441ff6a..4dca925e952ce 100644 --- a/src/plugins/controls/public/options_list/components/options_list.scss +++ b/src/plugins/controls/public/options_list/components/options_list.scss @@ -31,10 +31,9 @@ color: $euiColorDanger; } - .euiFilterButton__text-hasNotification { + .optionsList--selectionText { flex-grow: 1; - justify-content: space-between; - width: 0; + text-align: left; } } diff --git a/src/plugins/controls/public/options_list/components/options_list_control.tsx b/src/plugins/controls/public/options_list/components/options_list_control.tsx index 11683266ad2f0..5a358b29c6196 100644 --- a/src/plugins/controls/public/options_list/components/options_list_control.tsx +++ b/src/plugins/controls/public/options_list/components/options_list_control.tsx @@ -152,6 +152,7 @@ export const OptionsListControl = ({ isSelected={isPopoverOpen} numActiveFilters={validSelectionsCount} hasActiveFilters={Boolean(validSelectionsCount)} + textProps={{ className: 'optionsList--selectionText' }} > {hasSelections || existsSelected ? selectionDisplayNode diff --git a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx index 85d273728f6a2..72c1667172961 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_serverless.test.tsx @@ -130,8 +130,8 @@ describe('DiscoverTopNavServerless', () => { }); }); - describe('LogExplorerTabs', () => { - it('should render when showLogExplorerTabs is true', async () => { + describe('LogsExplorerTabs', () => { + it('should render when showLogsExplorerTabs is true', async () => { mockUseKibana.mockReturnValue({ services: { ...mockDiscoverService, @@ -148,12 +148,12 @@ describe('DiscoverTopNavServerless', () => { const topNav = screen.queryByTestId('discoverTopNavServerless'); expect(topNav).not.toBeNull(); await waitFor(() => { - const logExplorerTabs = screen.queryByTestId('logExplorerTabs'); + const logExplorerTabs = screen.queryByTestId('logsExplorerTabs'); expect(logExplorerTabs).not.toBeNull(); }); }); - it('should not render when showLogExplorerTabs is false', async () => { + it('should not render when showLogsExplorerTabs is false', async () => { mockUseKibana.mockReturnValue({ services: { ...mockDiscoverService, @@ -169,7 +169,7 @@ describe('DiscoverTopNavServerless', () => { const topNav = screen.queryByTestId('discoverTopNavServerless'); expect(topNav).not.toBeNull(); await waitFor(() => { - const logExplorerTabs = screen.queryByTestId('logExplorerTabs'); + const logExplorerTabs = screen.queryByTestId('logsExplorerTabs'); expect(logExplorerTabs).toBeNull(); }); }); diff --git a/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx b/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx index ea9504d6b7ba1..fb9895b62b269 100644 --- a/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx +++ b/src/plugins/discover/public/components/log_explorer_tabs/log_explorer_tabs.tsx @@ -41,7 +41,7 @@ export const LogExplorerTabs = ({ services, selectedTab }: LogExplorerTabsProps) }); return ( - + - {i18n.translate('discover.logExplorerTabs.discover', { + {i18n.translate('discover.logsExplorerTabs.discover', { defaultMessage: 'Discover', })} @@ -58,9 +58,9 @@ export const LogExplorerTabs = ({ services, selectedTab }: LogExplorerTabsProps) href={logExplorerUrl} onClick={navigateToLogExplorer} css={{ '.euiTab__content': { lineHeight: euiTheme.size.xxxl } }} - data-test-subj="logExplorerTab" + data-test-subj="logsExplorerTab" > - {i18n.translate('discover.logExplorerTabs.logExplorer', { + {i18n.translate('discover.logsExplorerTabs.logsExplorer', { defaultMessage: 'Logs Explorer', })} diff --git a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts index c7ec7deaa16a9..97c2c74814db1 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts @@ -155,6 +155,7 @@ export const applicationUsageSchema = { ml: commonSchema, monitoring: commonSchema, 'observability-log-explorer': commonSchema, + 'observability-logs-explorer': commonSchema, 'observability-overview': commonSchema, observabilityOnboarding: commonSchema, observabilityAIAssistant: commonSchema, diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 7fbf4ad7aeeb3..7686be9584e4e 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -4718,6 +4718,137 @@ } } }, + "observability-logs-explorer": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "Always `main`" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 90 days" + } + }, + "views": { + "type": "array", + "items": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "The application view being tracked" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application sub view since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application sub view is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" + } + } + } + } + } + } + }, "observability-overview": { "properties": { "appId": { diff --git a/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts b/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts index a6cd54f55ed86..d62474f2c0bd2 100644 --- a/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts +++ b/src/plugins/visualizations/public/embeddable/interfaces/has_visualize_config.ts @@ -6,13 +6,18 @@ * Side Public License, v 1. */ +import { type HasType, apiIsOfType } from '@kbn/presentation-publishing'; import { VisParams } from '../../types'; import Vis from '../../vis'; -export interface HasVisualizeConfig { +export type HasVisualizeConfig = HasType<'visualization'> & { getVis: () => Vis; -} +}; export const apiHasVisualizeConfig = (api: unknown): api is HasVisualizeConfig => { - return Boolean(api && typeof (api as HasVisualizeConfig).getVis === 'function'); + return Boolean( + api && + apiIsOfType(api, 'visualization') && + typeof (api as HasVisualizeConfig).getVis === 'function' + ); }; diff --git a/src/plugins/visualizations/tsconfig.json b/src/plugins/visualizations/tsconfig.json index 296367543271a..5b1a718d551c8 100644 --- a/src/plugins/visualizations/tsconfig.json +++ b/src/plugins/visualizations/tsconfig.json @@ -67,7 +67,8 @@ "@kbn/logging", "@kbn/content-management-table-list-view-common", "@kbn/chart-expressions-common", - "@kbn/shared-ux-utility" + "@kbn/shared-ux-utility", + "@kbn/presentation-publishing" ], "exclude": [ "target/**/*", diff --git a/test/examples/expressions_explorer/expressions.ts b/test/examples/expressions_explorer/expressions.ts index 916a81c781ec1..d988f0ae22f92 100644 --- a/test/examples/expressions_explorer/expressions.ts +++ b/test/examples/expressions_explorer/expressions.ts @@ -17,7 +17,8 @@ export default function ({ getService }: PluginFunctionalProviderContext) { const find = getService('find'); const browser = getService('browser'); - describe('', () => { + // FLAKY: https://github.com/elastic/kibana/issues/156780 + describe.skip('', () => { it('runs expression', async () => { await retry.try(async () => { const text = await testSubjects.getVisibleText('expressionResult'); diff --git a/x-pack/packages/kbn-slo-schema/src/models/duration.ts b/x-pack/packages/kbn-slo-schema/src/models/duration.ts index 33ff6cbd25ac8..d507dcee6514e 100644 --- a/x-pack/packages/kbn-slo-schema/src/models/duration.ts +++ b/x-pack/packages/kbn-slo-schema/src/models/duration.ts @@ -57,6 +57,10 @@ class Duration { asSeconds(): number { return moment.duration(this.value, toMomentUnitOfTime(this.unit)).asSeconds(); } + + asMinutes(): number { + return moment.duration(this.value, toMomentUnitOfTime(this.unit)).asMinutes(); + } } const toDurationUnit = (unit: string): DurationUnit => { diff --git a/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts b/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts index 4f72827957ef7..c939d25cfac15 100644 --- a/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts +++ b/x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts @@ -60,13 +60,18 @@ const createSLOResponseSchema = t.type({ }); const getPreviewDataParamsSchema = t.type({ - body: t.type({ - indicator: indicatorSchema, - range: t.type({ - start: t.number, - end: t.number, + body: t.intersection([ + t.type({ + indicator: indicatorSchema, + range: t.type({ + start: t.number, + end: t.number, + }), }), - }), + t.partial({ + objective: objectiveSchema, + }), + ]), }); const getPreviewDataResponseSchema = t.array(previewDataSchema); @@ -282,6 +287,7 @@ type BudgetingMethod = t.OutputOf; type TimeWindow = t.OutputOf; type IndicatorType = t.OutputOf; type Indicator = t.OutputOf; +type Objective = t.OutputOf; type APMTransactionErrorRateIndicator = t.OutputOf; type APMTransactionDurationIndicator = t.OutputOf; type MetricCustomIndicator = t.OutputOf; @@ -350,6 +356,7 @@ export type { GetSLOInstancesResponse, IndicatorType, Indicator, + Objective, MetricCustomIndicator, TimesliceMetricIndicator, TimesliceMetricBasicMetricWithField, diff --git a/x-pack/plugins/apm/common/instances.ts b/x-pack/plugins/apm/common/instances.ts new file mode 100644 index 0000000000000..8a1cdb4eed538 --- /dev/null +++ b/x-pack/plugins/apm/common/instances.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import * as t from 'io-ts'; + +export const instancesSortFieldRt = t.keyof({ + serviceNodeName: null, + latency: null, + throughput: null, + errorRate: null, + cpuUsage: null, + memoryUsage: null, +}); + +export type InstancesSortField = t.TypeOf; diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts index 889724f664f9b..c0c3c032a0e61 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts @@ -115,6 +115,31 @@ describe('Service inventory', () => { }); }); + describe('Table search', () => { + beforeEach(() => { + cy.updateAdvancedSettings({ + 'observability:apmEnableTableSearchBar': true, + }); + + cy.loginAsEditorUser(); + }); + + it('filters for java service on the table', () => { + cy.visitKibana(serviceInventoryHref); + cy.contains('opbeans-node'); + cy.contains('opbeans-java'); + cy.contains('opbeans-rum'); + cy.get('[data-test-subj="tableSearchInput"]').type('java'); + cy.contains('opbeans-node').should('not.exist'); + cy.contains('opbeans-java'); + cy.contains('opbeans-rum').should('not.exist'); + cy.get('[data-test-subj="tableSearchInput"]').clear(); + cy.contains('opbeans-node'); + cy.contains('opbeans-java'); + cy.contains('opbeans-rum'); + }); + }); + describe('Check detailed statistics API with multiple services', () => { before(() => { // clean previous data created diff --git a/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx b/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx index 9aeff02dff4f3..858d80e645ae4 100644 --- a/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx +++ b/x-pack/plugins/apm/public/components/app/dependency_operation_detail_view/index.tsx @@ -9,7 +9,6 @@ import { i18n } from '@kbn/i18n'; import { omit, orderBy } from 'lodash'; import React, { useEffect, useMemo, useRef } from 'react'; import { useHistory } from 'react-router-dom'; -import type { DependencySpan } from '../../../../server/routes/dependencies/get_top_dependency_spans'; import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event/chart_pointer_event_context'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useApmRouter } from '../../../hooks/use_apm_router'; @@ -17,13 +16,12 @@ import { useDependencyDetailOperationsBreadcrumb } from '../../../hooks/use_depe import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; import { DependencyMetricCharts } from '../../shared/dependency_metric_charts'; -import { DetailViewHeader } from './detail_view_header'; import { ResettingHeightRetainer } from '../../shared/height_retainer/resetting_height_container'; import { push, replace } from '../../shared/links/url_helpers'; -import { SortFunction } from '../../shared/managed_table'; import { useWaterfallFetcher } from '../transaction_details/use_waterfall_fetcher'; import { WaterfallWithSummary } from '../transaction_details/waterfall_with_summary'; import { DependencyOperationDistributionChart } from './dependency_operation_distribution_chart'; +import { DetailViewHeader } from './detail_view_header'; import { maybeRedirectToAvailableSpanSample } from './maybe_redirect_to_available_span_sample'; export function DependencyOperationDetailView() { @@ -86,25 +84,15 @@ export function DependencyOperationDetailView() { ] ); - const getSortedSamples: SortFunction = ( - items, - localSortField, - localSortDirection - ) => { - return orderBy(items, localSortField, localSortDirection); - }; - const samples = useMemo(() => { return ( - getSortedSamples( - spanFetch.data?.spans ?? [], - sortField, - sortDirection - ).map((span) => ({ - spanId: span.spanId, - traceId: span.traceId, - transactionId: span.transactionId, - })) || [] + orderBy(spanFetch.data?.spans ?? [], sortField, sortDirection).map( + (span) => ({ + spanId: span.spanId, + traceId: span.traceId, + transactionId: span.transactionId, + }) + ) || [] ); }, [spanFetch.data?.spans, sortField, sortDirection]); 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 e0133ba6a6695..7f0f2bda106ba 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 @@ -166,7 +166,7 @@ export function ErrorGroupDetails() { [environment, kuery, serviceName, start, end, groupId] ); - const { errorDistributionData, status: errorDistributionStatus } = + const { errorDistributionData, errorDistributionStatus } = useErrorGroupDistributionFetcher({ serviceName, groupId, 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 index c61a37fa86e5e..d1183c91cb3e4 100644 --- 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 @@ -4,14 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { CoreStart } from '@kbn/core/public'; 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 '.'; +import { ApmPluginContextValue } from '../../../../context/apm_plugin/apm_plugin_context'; +import { MockApmPluginStorybook } from '../../../../context/apm_plugin/mock_apm_plugin_storybook'; +import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; type Args = ComponentProps; @@ -19,19 +18,86 @@ const stories: Meta = { title: 'app/ErrorGroupOverview/ErrorGroupList', component: ErrorGroupList, decorators: [ - (StoryComponent) => { + (StoryComponent, { args }) => { + const coreMock = { + http: { + get: async (endpoint: string) => { + switch (endpoint) { + case `/internal/apm/services/test service/errors/groups/main_statistics`: + return { + errorGroups: [ + { + name: 'net/http: abort Handler', + occurrences: 14, + culprit: 'Main.func2', + groupId: '83a653297ec29afed264d7b60d5cda7b', + lastSeen: 1634833121434, + handled: false, + type: 'errorString', + }, + { + name: 'POST /api/orders (500)', + occurrences: 5, + culprit: 'logrusMiddleware', + groupId: '7a640436a9be648fd708703d1ac84650', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + { + name: 'write tcp 10.36.2.24:3000->10.36.1.14:34232: write: connection reset by peer', + occurrences: 4, + culprit: 'apiHandlers.getProductCustomers', + groupId: '95ca0e312c109aa11e298bcf07f1445b', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + { + name: 'write tcp 10.36.0.21:3000->10.36.1.252:57070: write: connection reset by peer', + occurrences: 3, + culprit: 'apiHandlers.getCustomers', + groupId: '4053d7e33d2b716c819bd96d9d6121a2', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + { + name: 'write tcp 10.36.0.21:3000->10.36.0.88:33926: write: broken pipe', + occurrences: 2, + culprit: 'apiHandlers.getOrders', + groupId: '94f4ca8ec8c02e5318cf03f46ae4c1f3', + lastSeen: 1634833121434, + handled: false, + type: 'OpError', + }, + ], + maxCountExceeded: false, + }; + default: + return { + errorGroups: [], + maxCountExceeded: false, + }; + } + }, + }, + } as unknown as CoreStart; + return ( - - - - - - - + + ); }, ], @@ -42,60 +108,14 @@ export const Example: Story = (args) => { return ; }; Example.args = { - mainStatistics: [ - { - name: 'net/http: abort Handler', - occurrences: 14, - culprit: 'Main.func2', - groupId: '83a653297ec29afed264d7b60d5cda7b', - lastSeen: 1634833121434, - handled: false, - type: 'errorString', - }, - { - name: 'POST /api/orders (500)', - occurrences: 5, - culprit: 'logrusMiddleware', - groupId: '7a640436a9be648fd708703d1ac84650', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - { - name: 'write tcp 10.36.2.24:3000->10.36.1.14:34232: write: connection reset by peer', - occurrences: 4, - culprit: 'apiHandlers.getProductCustomers', - groupId: '95ca0e312c109aa11e298bcf07f1445b', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - { - name: 'write tcp 10.36.0.21:3000->10.36.1.252:57070: write: connection reset by peer', - occurrences: 3, - culprit: 'apiHandlers.getCustomers', - groupId: '4053d7e33d2b716c819bd96d9d6121a2', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - { - name: 'write tcp 10.36.0.21:3000->10.36.0.88:33926: write: broken pipe', - occurrences: 2, - culprit: 'apiHandlers.getOrders', - groupId: '94f4ca8ec8c02e5318cf03f46ae4c1f3', - lastSeen: 1634833121434, - handled: false, - type: 'OpError', - }, - ], serviceName: 'test service', + initialPageSize: 5, }; export const EmptyState: Story = (args) => { return ; }; EmptyState.args = { - mainStatistics: [], - serviceName: 'test service', + serviceName: 'foo', + initialPageSize: 5, }; diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx index 819b75a44c7b1..3fbc22b845d33 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx @@ -13,11 +13,11 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import React, { useMemo } from 'react'; +import React, { useMemo, useState } from 'react'; +import { isPending } from '../../../../hooks/use_fetcher'; import { NOT_AVAILABLE_LABEL } from '../../../../../common/i18n'; -import { asInteger } from '../../../../../common/utils/formatters'; -import { useApmParams } from '../../../../hooks/use_apm_params'; -import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; +import { asBigNumber } from '../../../../../common/utils/formatters'; +import { useAnyOfApmParams } from '../../../../hooks/use_apm_params'; import { truncate, unit } from '../../../../utils/style'; import { ChartType, @@ -26,9 +26,17 @@ import { import { SparkPlot } from '../../../shared/charts/spark_plot'; import { ErrorDetailLink } from '../../../shared/links/apm/error_detail_link'; import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; -import { ITableColumn, ManagedTable } from '../../../shared/managed_table'; +import { + ITableColumn, + ManagedTable, + TableOptions, +} from '../../../shared/managed_table'; import { TimestampTooltip } from '../../../shared/timestamp_tooltip'; import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; +import { + ErrorGroupItem, + useErrorGroupListData, +} from './use_error_group_list_data'; const GroupIdLink = euiStyled(ErrorDetailLink)` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; @@ -44,7 +52,6 @@ const ErrorLink = euiStyled(ErrorOverviewLink)` const MessageLink = euiStyled(ErrorDetailLink)` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; - font-size: ${({ theme }) => theme.eui.euiFontSizeM}; ${truncate('100%')}; `; @@ -52,79 +59,98 @@ const Culprit = euiStyled.div` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; `; -type ErrorGroupItem = - APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>['errorGroups'][0]; -type ErrorGroupDetailedStatistics = - APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; - interface Props { - mainStatistics: ErrorGroupItem[]; serviceName: string; - detailedStatisticsLoading: boolean; - detailedStatistics: ErrorGroupDetailedStatistics; - initialSortField: string; - initialSortDirection: 'asc' | 'desc'; + isCompactMode?: boolean; + initialPageSize: number; comparisonEnabled?: boolean; - isLoading: boolean; + saveTableOptionsToUrl?: boolean; + showPerPageOptions?: boolean; } -function ErrorGroupList({ - mainStatistics, +const defaultSorting = { + field: 'occurrences' as const, + direction: 'desc' as const, +}; + +export function ErrorGroupList({ serviceName, - detailedStatisticsLoading, - detailedStatistics, + isCompactMode = false, + initialPageSize, comparisonEnabled, - initialSortField, - initialSortDirection, - isLoading, + saveTableOptionsToUrl, + showPerPageOptions = true, }: Props) { - const { query } = useApmParams('/services/{serviceName}/errors'); + const { query } = useAnyOfApmParams( + '/services/{serviceName}/overview', + '/services/{serviceName}/errors' + ); const { offset } = query; + + const [renderedItems, setRenderedItems] = useState([]); + + const [sorting, setSorting] = + useState['sort']>(defaultSorting); + + const { + setDebouncedSearchQuery, + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + } = useErrorGroupListData({ renderedItems, sorting }); + + const isMainStatsLoading = isPending(mainStatisticsStatus); + const isDetailedStatsLoading = isPending(detailedStatisticsStatus); + const columns = useMemo(() => { - return [ - { - name: ( - <> - {i18n.translate('xpack.apm.errorsTable.groupIdColumnLabel', { - defaultMessage: 'Group ID', - })}{' '} - - - ), - field: 'groupId', - sortable: false, - width: `${unit * 6}px`, - render: (_, { groupId }) => { - return ( - - {groupId.slice(0, 5) || NOT_AVAILABLE_LABEL} - - ); - }, + const groupIdColumn: ITableColumn = { + name: ( + <> + {i18n.translate('xpack.apm.errorsTable.groupIdColumnLabel', { + defaultMessage: 'Group ID', + })}{' '} + + + ), + field: 'groupId', + sortable: false, + width: `${unit * 6}px`, + render: (_, { groupId }) => { + return ( + + {groupId.slice(0, 5) || NOT_AVAILABLE_LABEL} + + ); }, + }; + + return [ + ...(isCompactMode ? [] : [groupIdColumn]), { name: i18n.translate('xpack.apm.errorsTable.typeColumnLabel', { defaultMessage: 'Type', }), field: 'type', + width: `${unit * 10}px`, sortable: false, render: (_, { type }) => { return ( @@ -150,7 +176,7 @@ function ErrorGroupList({ ), field: 'message', sortable: false, - width: '50%', + width: '60%', render: (_, item) => { return ( @@ -165,37 +191,46 @@ function ErrorGroupList({ {item.name || NOT_AVAILABLE_LABEL} -
- - {item.culprit || NOT_AVAILABLE_LABEL} - + {isCompactMode ? null : ( + <> +
+ + {item.culprit || NOT_AVAILABLE_LABEL} + + + )}
); }, }, - { - name: '', - field: 'handled', - sortable: false, - align: RIGHT_ALIGNMENT, - render: (_, { handled }) => - handled === false && ( - - {i18n.translate('xpack.apm.errorsTable.unhandledLabel', { - defaultMessage: 'Unhandled', - })} - - ), - }, + ...(isCompactMode + ? [] + : [ + { + name: '', + field: 'handled', + sortable: false, + align: RIGHT_ALIGNMENT, + render: (_, { handled }) => + handled === false && ( + + {i18n.translate('xpack.apm.errorsTable.unhandledLabel', { + defaultMessage: 'Unhandled', + })} + + ), + } as ITableColumn, + ]), { field: 'lastSeen', sortable: true, name: i18n.translate('xpack.apm.errorsTable.lastSeenColumnLabel', { defaultMessage: 'Last seen', }), + width: `${unit * 6}px`, align: RIGHT_ALIGNMENT, render: (_, { lastSeen }) => lastSeen ? ( @@ -212,6 +247,7 @@ function ErrorGroupList({ sortable: true, dataType: 'number', align: RIGHT_ALIGNMENT, + width: `${unit * 12}px`, render: (_, { occurrences, groupId }) => { const currentPeriodTimeseries = detailedStatistics?.currentPeriod?.[groupId]?.timeseries; @@ -224,14 +260,14 @@ function ErrorGroupList({ >; }, [ + isCompactMode, serviceName, query, - detailedStatistics, + detailedStatistics?.currentPeriod, + detailedStatistics?.previousPeriod, + isDetailedStatsLoading, comparisonEnabled, - detailedStatisticsLoading, offset, ]); + const tableSearchBar = useMemo(() => { + return { + fieldsToSearch: ['name', 'groupId', 'culprit', 'type'] as Array< + keyof ErrorGroupItem + >, + maxCountExceeded: mainStatistics.maxCountExceeded, + onChangeSearchQuery: setDebouncedSearchQuery, + placeholder: i18n.translate( + 'xpack.apm.errorsTable.filterErrorsPlaceholder', + { defaultMessage: 'Search errors by message, type or culprit' } + ), + }; + }, [mainStatistics.maxCountExceeded, setDebouncedSearchQuery]); + return ( ); } - -export { ErrorGroupList }; diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/use_error_group_list_data.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/use_error_group_list_data.tsx new file mode 100644 index 0000000000000..3e3c4d3ea829e --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/use_error_group_list_data.tsx @@ -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 { v4 as uuidv4 } from 'uuid'; +import { useFetcher } from '../../../../hooks/use_fetcher'; +import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; +import { useTimeRange } from '../../../../hooks/use_time_range'; +import { useStateDebounced } from '../../../../hooks/use_debounce'; +import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; +import { TableOptions } from '../../../shared/managed_table'; +import { useAnyOfApmParams } from '../../../../hooks/use_apm_params'; +import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; + +type MainStatistics = + APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>; +type DetailedStatistics = + APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; + +export type ErrorGroupItem = MainStatistics['errorGroups'][0]; + +const INITIAL_MAIN_STATISTICS: MainStatistics & { requestId: string } = { + requestId: '', + errorGroups: [], + maxCountExceeded: false, +}; + +const INITIAL_STATE_DETAILED_STATISTICS: DetailedStatistics = { + currentPeriod: {}, + previousPeriod: {}, +}; + +export function useErrorGroupListData({ + renderedItems, + sorting, +}: { + renderedItems: ErrorGroupItem[]; + sorting: TableOptions['sort']; +}) { + const { serviceName } = useApmServiceContext(); + const [searchQuery, setDebouncedSearchQuery] = useStateDebounced(''); + + const { + query: { + environment, + kuery, + rangeFrom, + rangeTo, + offset, + comparisonEnabled, + }, + } = useAnyOfApmParams( + '/services/{serviceName}/overview', + '/services/{serviceName}/errors' + ); + + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + + const { + data: mainStatistics = INITIAL_MAIN_STATISTICS, + status: mainStatisticsStatus, + } = useFetcher( + (callApmApi) => { + if (start && end) { + return callApmApi( + 'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + sortField: sorting.field, + sortDirection: sorting.direction, + searchQuery, + }, + }, + } + ).then((response) => { + return { + ...response, + requestId: uuidv4(), + }; + }); + } + }, + [ + sorting.direction, + sorting.field, + start, + end, + serviceName, + environment, + kuery, + searchQuery, + ] + ); + + const { + data: detailedStatistics = INITIAL_STATE_DETAILED_STATISTICS, + status: detailedStatisticsStatus, + } = useFetcher( + (callApmApi) => { + if (mainStatistics.requestId && renderedItems.length && start && end) { + return callApmApi( + 'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + numBuckets: 20, + offset: + comparisonEnabled && isTimeComparison(offset) + ? offset + : undefined, + }, + body: { + groupIds: JSON.stringify( + renderedItems.map(({ groupId }) => groupId).sort() + ), + }, + }, + } + ); + } + }, + // only fetches agg results when main statistics are ready + // eslint-disable-next-line react-hooks/exhaustive-deps + [mainStatistics.requestId, renderedItems, comparisonEnabled, offset], + { preservePreviousData: false } + ); + + return { + setDebouncedSearchQuery, + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + }; +} 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 d6450ad4def57..f391e73012b40 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 @@ -13,166 +13,29 @@ import { EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { orderBy } from 'lodash'; import React from 'react'; -import { v4 as uuidv4 } from 'uuid'; 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 { - FETCH_STATUS, - isPending, - useFetcher, -} from '../../../hooks/use_fetcher'; -import { useTimeRange } from '../../../hooks/use_time_range'; -import { APIReturnType } from '../../../services/rest/create_call_apm_api'; import { FailedTransactionRateChart } from '../../shared/charts/failed_transaction_rate_chart'; -import { isTimeComparison } from '../../shared/time_comparison/get_comparison_options'; import { ErrorDistribution } from '../error_group_details/distribution'; import { ErrorGroupList } from './error_group_list'; -type ErrorGroupMainStatistics = - APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>; -type ErrorGroupDetailedStatistics = - APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; - -const INITIAL_STATE_MAIN_STATISTICS: { - errorGroupMainStatistics: ErrorGroupMainStatistics['errorGroups']; - requestId?: string; - currentPageGroupIds: ErrorGroupMainStatistics['errorGroups']; -} = { - errorGroupMainStatistics: [], - requestId: undefined, - currentPageGroupIds: [], -}; - -const INITIAL_STATE_DETAILED_STATISTICS: ErrorGroupDetailedStatistics = { - currentPeriod: {}, - previousPeriod: {}, -}; - export function ErrorGroupOverview() { const { serviceName } = useApmServiceContext(); const { - query: { - environment, - kuery, - sortField = 'occurrences', - sortDirection = 'desc', - rangeFrom, - rangeTo, - offset, - comparisonEnabled, - page = 0, - pageSize = 25, - }, + query: { environment, kuery, comparisonEnabled }, } = useApmParams('/services/{serviceName}/errors'); - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { errorDistributionData, status } = useErrorGroupDistributionFetcher({ - serviceName, - groupId: undefined, - environment, - kuery, - }); - - const { - data: errorGroupListData = INITIAL_STATE_MAIN_STATISTICS, - status: errorGroupListDataStatus, - } = useFetcher( - (callApmApi) => { - const normalizedSortDirection = sortDirection === 'asc' ? 'asc' : 'desc'; - - if (start && end) { - return callApmApi( - 'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics', - { - params: { - path: { - serviceName, - }, - query: { - environment, - kuery, - start, - end, - sortField, - sortDirection: normalizedSortDirection, - }, - }, - } - ).then((response) => { - const currentPageGroupIds = orderBy( - response.errorGroups, - sortField, - sortDirection - ) - .slice(page * pageSize, (page + 1) * pageSize) - .map(({ groupId }) => groupId) - .sort(); - - return { - // Everytime the main statistics is refetched, updates the requestId making the comparison API to be refetched. - requestId: uuidv4(), - errorGroupMainStatistics: response.errorGroups, - currentPageGroupIds, - }; - }); - } - }, - [ + const { errorDistributionData, errorDistributionStatus } = + useErrorGroupDistributionFetcher({ + serviceName, + groupId: undefined, environment, kuery, - serviceName, - start, - end, - sortField, - sortDirection, - page, - pageSize, - ] - ); - - const { requestId, errorGroupMainStatistics, currentPageGroupIds } = - errorGroupListData; - - const { - data: errorGroupDetailedStatistics = INITIAL_STATE_DETAILED_STATISTICS, - status: errorGroupDetailedStatisticsStatus, - } = useFetcher( - (callApmApi) => { - if (requestId && currentPageGroupIds.length && start && end) { - return callApmApi( - 'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - numBuckets: 20, - offset: - comparisonEnabled && isTimeComparison(offset) - ? offset - : undefined, - }, - body: { - groupIds: JSON.stringify(currentPageGroupIds), - }, - }, - } - ); - } - }, - // only fetches agg results when requestId changes - // eslint-disable-next-line react-hooks/exhaustive-deps - [requestId], - { preservePreviousData: false } - ); + }); return ( @@ -182,7 +45,7 @@ export function ErrorGroupOverview() { diff --git a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx index ea03b6cc58ac8..b59f0064349bd 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_group_details/error_group_details/index.tsx @@ -180,13 +180,15 @@ export function ErrorGroupDetails() { [environment, kueryWithMobileFilters, serviceName, start, end, groupId] ); - const { errorDistributionData, status: errorDistributionStatus } = - useErrorGroupDistributionFetcher({ - serviceName, - groupId, - environment, - kuery: kueryWithMobileFilters, - }); + const { + errorDistributionData, + errorDistributionStatus: errorDistributionStatus, + } = useErrorGroupDistributionFetcher({ + serviceName, + groupId, + environment, + kuery: kueryWithMobileFilters, + }); useEffect(() => { const selectedSample = errorSamplesData?.errorSampleIds.find( diff --git a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx index 67214733bece4..1675932b26063 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/errors_and_crashes_overview/errors_overview.tsx @@ -85,12 +85,13 @@ export function MobileErrorsOverview() { kuery, }); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { errorDistributionData, status } = useErrorGroupDistributionFetcher({ - serviceName, - groupId: undefined, - environment, - kuery: kueryWithMobileFilters, - }); + const { errorDistributionData, errorDistributionStatus: status } = + useErrorGroupDistributionFetcher({ + serviceName, + groupId: undefined, + environment, + kuery: kueryWithMobileFilters, + }); const { data: errorGroupListData = INITIAL_STATE_MAIN_STATISTICS, status: errorGroupListDataStatus, diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx index 1073a459cecbc..55bde1c8fcf2b 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx @@ -5,22 +5,20 @@ * 2.0. */ -import { - EuiCallOut, - EuiEmptyPrompt, - EuiFlexGroup, - EuiFlexItem, - EuiText, -} from '@elastic/eui'; +import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import React from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; +import { APIReturnType } from '../../../services/rest/create_call_apm_api'; +import { useStateDebounced } from '../../../hooks/use_debounce'; import { ApmDocumentType } from '../../../../common/document_type'; -import { ServiceInventoryFieldName } from '../../../../common/service_inventory'; +import { + ServiceInventoryFieldName, + ServiceListItem, +} from '../../../../common/service_inventory'; import { useAnomalyDetectionJobsContext } from '../../../context/anomaly_detection_jobs/use_anomaly_detection_jobs_context'; import { useApmParams } from '../../../hooks/use_apm_params'; -import { FETCH_STATUS, isPending } from '../../../hooks/use_fetcher'; +import { FETCH_STATUS } from '../../../hooks/use_fetcher'; import { useLocalStorage } from '../../../hooks/use_local_storage'; import { usePreferredDataSourceAndBucketSize } from '../../../hooks/use_preferred_data_source_and_bucket_size'; import { useProgressiveFetcher } from '../../../hooks/use_progressive_fetcher'; @@ -30,17 +28,19 @@ import { SearchBar } from '../../shared/search_bar/search_bar'; import { isTimeComparison } from '../../shared/time_comparison/get_comparison_options'; import { ServiceList } from './service_list'; import { orderServiceItems } from './service_list/order_service_items'; +import { SortFunction } from '../../shared/managed_table'; + +type MainStatisticsApiResponse = APIReturnType<'GET /internal/apm/services'>; -const initialData = { +const INITIAL_PAGE_SIZE = 25; +const INITIAL_DATA: MainStatisticsApiResponse & { requestId: string } = { requestId: '', items: [], - hasHistoricalData: true, - hasLegacyData: false, + serviceOverflowCount: 0, + maxCountExceeded: false, }; -const INITIAL_PAGE_SIZE = 25; - -function useServicesMainStatisticsFetcher() { +function useServicesMainStatisticsFetcher(searchQuery: string | undefined) { const { query: { rangeFrom, @@ -67,7 +67,7 @@ function useServicesMainStatisticsFetcher() { const shouldUseDurationSummary = !!preferred?.source?.hasDurationSummaryField; - const mainStatisticsFetch = useProgressiveFetcher( + const { data = INITIAL_DATA, status } = useProgressiveFetcher( (callApmApi) => { if (preferred) { return callApmApi('GET /internal/apm/services', { @@ -81,6 +81,7 @@ function useServicesMainStatisticsFetcher() { useDurationSummary: shouldUseDurationSummary, documentType: preferred.source.documentType, rollupInterval: preferred.source.rollupInterval, + searchQuery, }, }, }).then((mainStatisticsData) => { @@ -99,7 +100,8 @@ function useServicesMainStatisticsFetcher() { end, serviceGroup, preferred, - // not used, but needed to update the requestId to call the details statistics API when table is options are updated + searchQuery, + // not used, but needed to update the requestId to call the details statistics API when table options are updated page, pageSize, sortField, @@ -107,23 +109,15 @@ function useServicesMainStatisticsFetcher() { ] ); - return { - mainStatisticsFetch, - }; + return { mainStatisticsData: data, mainStatisticsStatus: status }; } function useServicesDetailedStatisticsFetcher({ mainStatisticsFetch, - initialSortField, - initialSortDirection, - tiebreakerField, + renderedItems, }: { - mainStatisticsFetch: ReturnType< - typeof useServicesMainStatisticsFetcher - >['mainStatisticsFetch']; - initialSortField: ServiceInventoryFieldName; - initialSortDirection: 'asc' | 'desc'; - tiebreakerField: ServiceInventoryFieldName; + mainStatisticsFetch: ReturnType; + renderedItems: ServiceListItem[]; }) { const { query: { @@ -133,10 +127,6 @@ function useServicesDetailedStatisticsFetcher({ kuery, offset, comparisonEnabled, - page = 0, - pageSize = INITIAL_PAGE_SIZE, - sortDirection = initialSortDirection, - sortField = initialSortField, }, } = useApmParams('/services'); @@ -150,22 +140,17 @@ function useServicesDetailedStatisticsFetcher({ numBuckets: 20, }); - const { data: mainStatisticsData = initialData } = mainStatisticsFetch; - - const currentPageItems = orderServiceItems({ - items: mainStatisticsData.items, - primarySortField: sortField as ServiceInventoryFieldName, - sortDirection, - tiebreakerField, - }).slice(page * pageSize, (page + 1) * pageSize); + const { mainStatisticsData, mainStatisticsStatus } = mainStatisticsFetch; const comparisonFetch = useProgressiveFetcher( (callApmApi) => { + const serviceNames = renderedItems.map(({ serviceName }) => serviceName); + if ( start && end && - currentPageItems.length && - mainStatisticsFetch.status === FETCH_STATUS.SUCCESS && + serviceNames.length > 0 && + mainStatisticsStatus === FETCH_STATUS.SUCCESS && dataSourceOptions ) { return callApmApi('POST /internal/apm/services/detailed_statistics', { @@ -184,12 +169,8 @@ function useServicesDetailedStatisticsFetcher({ bucketSizeInSeconds: dataSourceOptions.bucketSizeInSeconds, }, body: { - serviceNames: JSON.stringify( - currentPageItems - .map(({ serviceName }) => serviceName) - // Service name is sorted to guarantee the same order every time this API is called so the result can be cached. - .sort() - ), + // Service name is sorted to guarantee the same order every time this API is called so the result can be cached. + serviceNames: JSON.stringify(serviceNames.sort()), }, }, }); @@ -197,7 +178,7 @@ function useServicesDetailedStatisticsFetcher({ }, // only fetches detailed statistics when requestId is invalidated by main statistics api call or offset is changed // eslint-disable-next-line react-hooks/exhaustive-deps - [mainStatisticsData.requestId, offset, comparisonEnabled], + [mainStatisticsData.requestId, renderedItems, offset, comparisonEnabled], { preservePreviousData: false } ); @@ -205,21 +186,21 @@ function useServicesDetailedStatisticsFetcher({ } export function ServiceInventory() { - const { mainStatisticsFetch } = useServicesMainStatisticsFetcher(); + const [debouncedSearchQuery, setDebouncedSearchQuery] = useStateDebounced(''); - const mainStatisticsItems = mainStatisticsFetch.data?.items ?? []; + const [renderedItems, setRenderedItems] = useState([]); - const displayHealthStatus = mainStatisticsItems.some( + const mainStatisticsFetch = + useServicesMainStatisticsFetcher(debouncedSearchQuery); + const { mainStatisticsData, mainStatisticsStatus } = mainStatisticsFetch; + + const displayHealthStatus = mainStatisticsData.items.some( (item) => 'healthStatus' in item ); - const hasKibanaUiLimitRestrictedData = - mainStatisticsFetch.data?.maxServiceCountExceeded; - - const serviceOverflowCount = - mainStatisticsFetch.data?.serviceOverflowCount ?? 0; + const serviceOverflowCount = mainStatisticsData?.serviceOverflowCount ?? 0; - const displayAlerts = mainStatisticsItems.some( + const displayAlerts = mainStatisticsData.items.some( (item) => ServiceInventoryFieldName.AlertsCount in item ); @@ -233,9 +214,7 @@ export function ServiceInventory() { const { comparisonFetch } = useServicesDetailedStatisticsFetcher({ mainStatisticsFetch, - initialSortField, - initialSortDirection, - tiebreakerField, + renderedItems, }); const { anomalyDetectionSetupState } = useAnomalyDetectionJobsContext(); @@ -249,23 +228,20 @@ export function ServiceInventory() { !userHasDismissedCallout && shouldDisplayMlCallout(anomalyDetectionSetupState); - const isLoading = isPending(mainStatisticsFetch.status); - - const isFailure = mainStatisticsFetch.status === FETCH_STATUS.FAILURE; - const noItemsMessage = ( - - {i18n.translate('xpack.apm.servicesTable.notFoundLabel', { - defaultMessage: 'No services found', - })} - - } - titleSize="s" - /> - ); - - const items = mainStatisticsItems; + const noItemsMessage = useMemo(() => { + return ( + + {i18n.translate('xpack.apm.servicesTable.notFoundLabel', { + defaultMessage: 'No services found', + })} + + } + titleSize="s" + /> + ); + }, []); const mlCallout = ( @@ -277,27 +253,16 @@ export function ServiceInventory() { ); - const kibanaUiServiceLimitCallout = ( - - - - - - - + const sortFn: SortFunction = useCallback( + (itemsToSort, sortField, sortDirection) => { + return orderServiceItems({ + items: itemsToSort, + primarySortField: sortField, + sortDirection, + tiebreakerField, + }); + }, + [tiebreakerField] ); return ( @@ -305,12 +270,10 @@ export function ServiceInventory() { {displayMlCallout && mlCallout} - {hasKibanaUiLimitRestrictedData && kibanaUiServiceLimitCallout} { - return orderServiceItems({ - items: itemsToSort, - primarySortField: sortField, - sortDirection, - tiebreakerField, - }); - }} + sortFn={sortFn} comparisonData={comparisonFetch?.data} noItemsMessage={noItemsMessage} initialPageSize={INITIAL_PAGE_SIZE} serviceOverflowCount={serviceOverflowCount} + onChangeSearchQuery={setDebouncedSearchQuery} + maxCountExceeded={mainStatisticsData?.maxCountExceeded ?? false} + onChangeRenderedItems={setRenderedItems} /> diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx index 4d3186c784447..08e7a840b5dfb 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx @@ -17,7 +17,13 @@ import { import { i18n } from '@kbn/i18n'; import { ALERT_STATUS_ACTIVE } from '@kbn/rule-data-utils'; import { TypeOf } from '@kbn/typed-react-router-config'; -import React, { useCallback, useMemo } from 'react'; +import { omit } from 'lodash'; +import React, { useMemo } from 'react'; +import { + FETCH_STATUS, + isFailure, + isPending, +} from '../../../../hooks/use_fetcher'; import { ServiceHealthStatus } from '../../../../../common/service_health_status'; import { ServiceInventoryFieldName, @@ -44,7 +50,12 @@ import { import { EnvironmentBadge } from '../../../shared/environment_badge'; import { ServiceLink } from '../../../shared/links/apm/service_link'; import { ListMetric } from '../../../shared/list_metric'; -import { ITableColumn, ManagedTable } from '../../../shared/managed_table'; +import { + ITableColumn, + ManagedTable, + SortFunction, + TableSearchBar, +} from '../../../shared/managed_table'; import { HealthBadge } from './health_badge'; type ServicesDetailedStatisticsAPIResponse = @@ -273,32 +284,28 @@ export function getServiceColumns({ } interface Props { + status: FETCH_STATUS; items: ServiceListItem[]; comparisonDataLoading: boolean; comparisonData?: ServicesDetailedStatisticsAPIResponse; noItemsMessage?: React.ReactNode; - isLoading: boolean; - isFailure?: boolean; displayHealthStatus: boolean; displayAlerts: boolean; initialSortField: ServiceInventoryFieldName; initialPageSize: number; initialSortDirection: 'asc' | 'desc'; - sortFn: ( - sortItems: ServiceListItem[], - sortField: ServiceInventoryFieldName, - sortDirection: 'asc' | 'desc' - ) => ServiceListItem[]; - + sortFn: SortFunction; serviceOverflowCount: number; + maxCountExceeded: boolean; + onChangeSearchQuery: (searchQuery: string) => void; + onChangeRenderedItems: (renderedItems: ServiceListItem[]) => void; } export function ServiceList({ + status, items, noItemsMessage, comparisonDataLoading, comparisonData, - isLoading, - isFailure, displayHealthStatus, displayAlerts, initialSortField, @@ -306,67 +313,59 @@ export function ServiceList({ initialPageSize, sortFn, serviceOverflowCount, + maxCountExceeded, + onChangeSearchQuery, + onChangeRenderedItems, }: Props) { const breakpoints = useBreakpoints(); const { link } = useApmRouter(); - const showTransactionTypeColumn = items.some( ({ transactionType }) => transactionType && !isDefaultTransactionType(transactionType) ); - const { - // removes pagination and sort instructions from the query so it won't be passed down to next route - query: { - page, - pageSize, - sortDirection: direction, - sortField: field, - ...query - }, - } = useApmParams('/services'); - + const { query } = useApmParams('/services'); const { kuery } = query; - const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ kuery, }); - const serviceColumns = useMemo( - () => - getServiceColumns({ - query, - showTransactionTypeColumn, - comparisonDataLoading, - comparisonData, - breakpoints, - showHealthStatusColumn: displayHealthStatus, - showAlertsColumn: displayAlerts, - link, - serviceOverflowCount, - }), - [ - query, + const serviceColumns = useMemo(() => { + return getServiceColumns({ + // removes pagination and sort instructions from the query so it won't be passed down to next route + query: omit(query, 'page', 'pageSize', 'sortDirection', 'sortField'), showTransactionTypeColumn, comparisonDataLoading, comparisonData, breakpoints, - displayHealthStatus, - displayAlerts, + showHealthStatusColumn: displayHealthStatus, + showAlertsColumn: displayAlerts, link, serviceOverflowCount, - ] - ); + }); + }, [ + query, + showTransactionTypeColumn, + comparisonDataLoading, + comparisonData, + breakpoints, + displayHealthStatus, + displayAlerts, + link, + serviceOverflowCount, + ]); - const handleSort = useCallback( - (itemsToSort, sortField, sortDirection) => - sortFn( - itemsToSort, - sortField as ServiceInventoryFieldName, - sortDirection + const tableSearchBar: TableSearchBar = useMemo(() => { + return { + fieldsToSearch: ['serviceName'], + maxCountExceeded, + onChangeSearchQuery, + placeholder: i18n.translate( + 'xpack.apm.servicesTable.filterServicesPlaceholder', + { defaultMessage: 'Search services by name' } ), - [sortFn] - ); + }; + }, [maxCountExceeded, onChangeSearchQuery]); return ( @@ -381,6 +380,24 @@ export function ServiceList({ )} + + {maxCountExceeded && ( + + + + + + )} + + - isLoading={isLoading} - error={isFailure} + isLoading={isPending(status)} + error={isFailure(status)} columns={serviceColumns} items={items} noItemsMessage={noItemsMessage} initialSortField={initialSortField} initialSortDirection={initialSortDirection} initialPageSize={initialPageSize} - sortFn={handleSort} + sortFn={sortFn} + onChangeRenderedItems={onChangeRenderedItems} + tableSearchBar={tableSearchBar} /> diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts index 89dade9d8d0cd..17c018e272ee8 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/order_service_items.ts @@ -49,7 +49,7 @@ export function orderServiceItems({ sortDirection, }: { items: ServiceListItem[]; - primarySortField: ServiceInventoryFieldName; + primarySortField: string; tiebreakerField: ServiceInventoryFieldName; sortDirection: 'asc' | 'desc'; }): ServiceListItem[] { 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 index 515aadaf11b52..7f81dfcc0b3b1 100644 --- 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 @@ -8,6 +8,7 @@ import { CoreStart } from '@kbn/core/public'; import { Meta, Story } from '@storybook/react'; import React, { ComponentProps } from 'react'; +import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { ServiceList } from '.'; import { ServiceHealthStatus } from '../../../../../common/service_health_status'; import { ServiceInventoryFieldName } from '../../../../../common/service_inventory'; @@ -48,11 +49,11 @@ const stories: Meta = { }; export default stories; -export const Example: Story = (args) => { +export const ServiceListWithItems: Story = (args) => { return ; }; -Example.args = { - isLoading: false, +ServiceListWithItems.args = { + status: FETCH_STATUS.SUCCESS, items, displayHealthStatus: true, initialSortField: ServiceInventoryFieldName.HealthStatus, @@ -61,11 +62,11 @@ Example.args = { sortFn: (sortItems) => sortItems, }; -export const EmptyState: Story = (args) => { +export const ServiceListEmptyState: Story = (args) => { return ; }; -EmptyState.args = { - isLoading: false, +ServiceListEmptyState.args = { + status: FETCH_STATUS.SUCCESS, items: [], displayHealthStatus: true, initialSortField: ServiceInventoryFieldName.HealthStatus, @@ -78,7 +79,7 @@ export const WithHealthWarnings: Story = (args) => { return ; }; WithHealthWarnings.args = { - isLoading: false, + status: FETCH_STATUS.SUCCESS, initialPageSize: 25, items: items.map((item) => ({ ...item, @@ -87,12 +88,12 @@ WithHealthWarnings.args = { sortFn: (sortItems) => sortItems, }; -export const WithOverflowBucket: Story = (args) => { +export const ServiceListWithOverflowBucket: Story = (args) => { return ; }; -WithOverflowBucket.args = { - isLoading: false, +ServiceListWithOverflowBucket.args = { + status: FETCH_STATUS.SUCCESS, items: overflowItems, displayHealthStatus: false, initialSortField: ServiceInventoryFieldName.HealthStatus, 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 74856cbca3b11..04659b6b211bc 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 @@ -15,7 +15,7 @@ import { apmRouter } from '../../../routing/apm_route_config'; import * as timeSeriesColor from '../../../shared/charts/helper/get_timeseries_color'; import * as stories from './service_list.stories'; -const { Example, EmptyState } = composeStories(stories); +const { ServiceListEmptyState, ServiceListWithItems } = composeStories(stories); const query = { rangeFrom: 'now-15m', @@ -56,13 +56,13 @@ describe('ServiceList', () => { }); it('renders empty state', async () => { - render(); + render(); expect(await screen.findByRole('table')).toBeInTheDocument(); }); it('renders with data', async () => { - render(); + render(); expect(await screen.findByRole('table')).toBeInTheDocument(); }); 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 55972ede6e560..4b2ab0ad6c3a8 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 @@ -139,6 +139,7 @@ export function ServiceOverview() { start={start} end={end} showPerPageOptions={false} + numberOfTransactionsPerPage={5} /> diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx index 81e5509ca6239..499729b31ae3b 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx @@ -5,180 +5,20 @@ * 2.0. */ -import { - EuiBasicTable, - EuiFlexGroup, - EuiFlexItem, - EuiTitle, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { orderBy } from 'lodash'; -import React, { useState } from 'react'; -import { v4 as uuidv4 } from 'uuid'; -import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; -import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; -import { OverviewTableContainer } from '../../../shared/overview_table_container'; -import { getColumns } from '../../../shared/errors_table/get_columns'; +import React from 'react'; import { useApmParams } from '../../../../hooks/use_apm_params'; -import { useTimeRange } from '../../../../hooks/use_time_range'; +import { ErrorOverviewLink } from '../../../shared/links/apm/error_overview_link'; +import { ErrorGroupList } from '../../error_group_overview/error_group_list'; interface Props { serviceName: string; } -type ErrorGroupMainStatistics = - APIReturnType<'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics'>; -type ErrorGroupDetailedStatistics = - APIReturnType<'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics'>; - -type SortDirection = 'asc' | 'desc'; -type SortField = 'name' | 'lastSeen' | 'occurrences'; - -const PAGE_SIZE = 5; -const DEFAULT_SORT = { - direction: 'desc' as const, - field: 'occurrences' as const, -}; - -const INITIAL_STATE_MAIN_STATISTICS: { - items: ErrorGroupMainStatistics['errorGroups']; - totalItems: number; - requestId?: string; -} = { - items: [], - totalItems: 0, - requestId: undefined, -}; - -const INITIAL_STATE_DETAILED_STATISTICS: ErrorGroupDetailedStatistics = { - currentPeriod: {}, - previousPeriod: {}, -}; export function ServiceOverviewErrorsTable({ serviceName }: Props) { - const [tableOptions, setTableOptions] = useState<{ - pageIndex: number; - sort: { - direction: SortDirection; - field: SortField; - }; - }>({ - pageIndex: 0, - sort: DEFAULT_SORT, - }); - const { query } = useApmParams('/services/{serviceName}/overview'); - const { environment, kuery, rangeFrom, rangeTo, offset, comparisonEnabled } = - query; - - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - - const { pageIndex, sort } = tableOptions; - const { direction, field } = sort; - - const { data = INITIAL_STATE_MAIN_STATISTICS, status } = useFetcher( - (callApmApi) => { - if (!start || !end) { - return; - } - return callApmApi( - 'GET /internal/apm/services/{serviceName}/errors/groups/main_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - }, - }, - } - ).then((response) => { - const currentPageErrorGroups = orderBy( - response.errorGroups, - field, - direction - ).slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE); - - return { - // Everytime the main statistics is refetched, updates the requestId making the comparison API to be refetched. - requestId: uuidv4(), - items: currentPageErrorGroups, - totalItems: response.errorGroups.length, - }; - }); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [ - environment, - kuery, - start, - end, - serviceName, - pageIndex, - direction, - field, - // not used, but needed to trigger an update when offset is changed either manually by user or when time range is changed - offset, - // not used, but needed to trigger an update when comparison feature is disabled/enabled by user - comparisonEnabled, - ] - ); - - const { requestId, items, totalItems } = data; - - const { - data: errorGroupDetailedStatistics = INITIAL_STATE_DETAILED_STATISTICS, - status: errorGroupDetailedStatisticsStatus, - } = useFetcher( - (callApmApi) => { - if (requestId && items.length && start && end) { - return callApmApi( - 'POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - numBuckets: 20, - offset: - comparisonEnabled && isTimeComparison(offset) - ? offset - : undefined, - }, - body: { - groupIds: JSON.stringify( - items.map(({ groupId: groupId }) => groupId).sort() - ), - }, - }, - } - ); - } - }, - // only fetches agg results when requestId changes - // eslint-disable-next-line react-hooks/exhaustive-deps - [requestId], - { preservePreviousData: false } - ); - - const errorGroupDetailedStatisticsLoading = - errorGroupDetailedStatisticsStatus === FETCH_STATUS.LOADING; - - const columns = getColumns({ - serviceName, - errorGroupDetailedStatisticsLoading, - errorGroupDetailedStatistics, - comparisonEnabled, - query, - }); - return ( - - { - setTableOptions({ - pageIndex: newTableOptions.page?.index ?? 0, - sort: newTableOptions.sort - ? { - field: newTableOptions.sort.field as SortField, - direction: newTableOptions.sort.direction, - } - : DEFAULT_SORT, - }); - }} - sorting={{ - enableAllColumns: true, - sort, - }} - /> - + ); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx index ab6d66ab2130d..f9c084f89018f 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx @@ -6,7 +6,6 @@ */ import { EuiFlexItem, EuiPanel } from '@elastic/eui'; -import { orderBy } from 'lodash'; import React, { useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; import { isTimeComparison } from '../../shared/time_comparison/get_comparison_options'; @@ -25,6 +24,7 @@ import { TableOptions, } from './service_overview_instances_table'; import { LatencyAggregationType } from '../../../../common/latency_aggregation_types'; +import { InstancesSortField } from '../../../../common/instances'; interface ServiceOverviewInstancesChartAndTableProps { chartHeight: number; @@ -48,14 +48,6 @@ const INITIAL_STATE_DETAILED_STATISTICS: ApiResponseDetailedStats = { previousPeriod: {}, }; -export type SortField = - | 'serviceNodeName' - | 'latency' - | 'throughput' - | 'errorRate' - | 'cpuUsage' - | 'memoryUsage'; - export type SortDirection = 'asc' | 'desc'; export const PAGE_SIZE = 5; const DEFAULT_SORT = { @@ -122,6 +114,8 @@ export function ServiceOverviewInstancesChartAndTable({ comparisonEnabled && isTimeComparison(offset) ? offset : undefined, + sortField: tableOptions.sort.field, + sortDirection: tableOptions.sort.direction, }, }, } @@ -152,6 +146,7 @@ export function ServiceOverviewInstancesChartAndTable({ offset, // not used, but needed to trigger an update when comparison feature is disabled/enabled by user comparisonEnabled, + tableOptions.sort, ] ); @@ -162,19 +157,10 @@ export function ServiceOverviewInstancesChartAndTable({ currentPeriodItemsCount, } = mainStatsData; - const currentPeriodOrderedItems = orderBy( - // need top-level sortable fields for the managed table - currentPeriodItems.map((item) => ({ - ...item, - latency: item.latency ?? 0, - throughput: item.throughput ?? 0, - errorRate: item.errorRate ?? 0, - cpuUsage: item.cpuUsage ?? 0, - memoryUsage: item.memoryUsage ?? 0, - })), - field, - direction - ).slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE); + const currentPageItems = currentPeriodItems.slice( + pageIndex * PAGE_SIZE, + (pageIndex + 1) * PAGE_SIZE + ); const { data: detailedStatsData = INITIAL_STATE_DETAILED_STATISTICS, @@ -208,7 +194,7 @@ export function ServiceOverviewInstancesChartAndTable({ numBuckets: 20, transactionType, serviceNodeIds: JSON.stringify( - currentPeriodOrderedItems.map((item) => item.serviceNodeName) + currentPageItems.map((item) => item.serviceNodeName) ), offset: comparisonEnabled && isTimeComparison(offset) @@ -238,7 +224,7 @@ export function ServiceOverviewInstancesChartAndTable({ { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.cpuUsage; @@ -241,7 +240,6 @@ export function getColumns({ /> ); }, - sortable: true, }, { field: 'memoryUsage', @@ -250,6 +248,7 @@ export function getColumns({ { defaultMessage: 'Memory usage (avg.)' } ), align: RIGHT_ALIGNMENT, + sortable: true, render: (_, { serviceNodeName, memoryUsage }) => { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.memoryUsage; @@ -277,7 +276,6 @@ export function getColumns({ /> ); }, - sortable: true, }, { width: '40px', @@ -292,7 +290,10 @@ export function getColumns({ anchorPosition="leftCenter" button={ diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx index 5fad00dfa34ff..5e1a466864960 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx @@ -13,13 +13,11 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { ReactNode, useEffect, useState } from 'react'; -import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { PAGE_SIZE, SortDirection, - SortField, } from '../service_overview_instances_chart_and_table'; import { OverviewTableContainer } from '../../../shared/overview_table_container'; import { getColumns } from './get_columns'; @@ -27,6 +25,7 @@ import { InstanceDetails } from './intance_details'; import { useApmParams } from '../../../../hooks/use_apm_params'; import { useBreakpoints } from '../../../../hooks/use_breakpoints'; import { LatencyAggregationType } from '../../../../../common/latency_aggregation_types'; +import { InstancesSortField } from '../../../../../common/instances'; type ServiceInstanceMainStatistics = APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; @@ -39,7 +38,7 @@ export interface TableOptions { pageIndex: number; sort: { direction: SortDirection; - field: SortField; + field: InstancesSortField; }; } @@ -70,8 +69,6 @@ export function ServiceOverviewInstancesTable({ isLoading, isNotInitiated, }: Props) { - const { agentName } = useApmServiceContext(); - const { query: { kuery, latencyAggregationType, comparisonEnabled, offset }, } = useApmParams('/services/{serviceName}'); @@ -122,7 +119,6 @@ export function ServiceOverviewInstancesTable({ const shouldShowSparkPlots = !isXl; const columns = getColumns({ - agentName, serviceName, kuery, latencyAggregationType: latencyAggregationType as LatencyAggregationType, @@ -154,7 +150,9 @@ export function ServiceOverviewInstancesTable({

{i18n.translate('xpack.apm.serviceOverview.instancesTableTitle', { - defaultMessage: 'Instances', + defaultMessage: + 'Top {count} {count, plural, one {instance} other {instances}}', + values: { count: mainStatsItemCount }, })}

diff --git a/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx b/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx index 40f8f5ad1db25..37bf4c83c1960 100644 --- a/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx +++ b/x-pack/plugins/apm/public/components/app/settings/custom_link/index.test.tsx @@ -112,7 +112,7 @@ describe('CustomLink', () => { expect(createButton.disabled).toBeFalsy(); }); - it('enables edit button on custom link table when user has writte privileges', () => { + it('enables edit button on custom link table when user has write privileges', () => { const mockContext = getMockAPMContext({ canSave: true }); const { getAllByText } = render( diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx index 372138c1273a9..73f5e40aa2e2a 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx @@ -91,7 +91,7 @@ export function TransactionOverview() { - } - onChange={[Function]} - pagination={ - Object { - "pageIndex": 0, - "pageSize": 25, - "pageSizeOptions": Array [ - 10, - 25, - 50, - ], - "showPerPageOptions": true, - "totalItemCount": 3, - } - } - responsive={true} - sorting={ - Object { - "sort": Object { - "direction": "asc", - "field": "name", - }, - } - } - tableLayout="fixed" -/> -`; - -exports[`ManagedTable should render when specifying initial values 1`] = ` - - } - onChange={[Function]} - pagination={ - Object { - "pageIndex": 1, - "pageSize": 2, - "pageSizeOptions": Array [ - 10, - 25, - 50, - ], - "showPerPageOptions": false, - "totalItemCount": 3, - } - } - responsive={true} - sorting={ - Object { - "sort": Object { - "direction": "desc", - "field": "age", - }, - } - } - tableLayout="fixed" -/> -`; diff --git a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx index 88d9e88c5e7ba..7d6307d32ffb8 100644 --- a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx @@ -7,11 +7,30 @@ import { i18n } from '@kbn/i18n'; import { EuiBasicTable, EuiBasicTableColumn } from '@elastic/eui'; -import { orderBy } from 'lodash'; -import React, { ReactNode, useCallback, useMemo } from 'react'; +import { isEmpty, merge, orderBy } from 'lodash'; +import React, { + ReactNode, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; import { useHistory } from 'react-router-dom'; +import { apmEnableTableSearchBar } from '@kbn/observability-plugin/common'; import { useLegacyUrlParams } from '../../../context/url_params_context/use_url_params'; import { fromQuery, toQuery } from '../links/url_helpers'; +import { + getItemsFilteredBySearchQuery, + TableSearchBar, +} from '../table_search_bar/table_search_bar'; +import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; + +type SortDirection = 'asc' | 'desc'; + +export interface TableOptions { + page: { index: number; size: number }; + sort: { direction: SortDirection; field: keyof T }; +} // TODO: this should really be imported from EUI export interface ITableColumn { @@ -26,143 +45,274 @@ export interface ITableColumn { render?: (value: any, item: T) => unknown; } -interface Props { - items: T[]; - columns: Array>; - initialPageSize: number; - initialPageIndex?: number; - initialSortField?: ITableColumn['field']; - initialSortDirection?: 'asc' | 'desc'; - showPerPageOptions?: boolean; - noItemsMessage?: React.ReactNode; - sortItems?: boolean; - sortFn?: SortFunction; - pagination?: boolean; - isLoading?: boolean; - error?: boolean; - tableLayout?: 'auto' | 'fixed'; +export interface TableSearchBar { + isEnabled?: boolean; + fieldsToSearch: Array; + maxCountExceeded: boolean; + placeholder: string; + onChangeSearchQuery: (searchQuery: string) => void; } const PAGE_SIZE_OPTIONS = [10, 25, 50]; -function defaultSortFn( +function defaultSortFn( items: T[], - sortField: string, - sortDirection: 'asc' | 'desc' + sortField: keyof T, + sortDirection: SortDirection ) { - return orderBy(items, sortField, sortDirection); + return orderBy(items, sortField, sortDirection) as T[]; } export type SortFunction = ( items: T[], - sortField: string, - sortDirection: 'asc' | 'desc' + sortField: keyof T, + sortDirection: SortDirection ) => T[]; -function UnoptimizedManagedTable(props: Props) { +export const shouldfetchServer = ({ + maxCountExceeded, + newSearchQuery, + oldSearchQuery, +}: { + maxCountExceeded: boolean; + newSearchQuery: string; + oldSearchQuery: string; +}) => maxCountExceeded || !newSearchQuery.includes(oldSearchQuery); + +function UnoptimizedManagedTable(props: { + items: T[]; + columns: Array>; + noItemsMessage?: React.ReactNode; + isLoading?: boolean; + error?: boolean; + + // pagination + pagination?: boolean; + initialPageSize: number; + initialPageIndex?: number; + initialSortField?: string; + initialSortDirection?: SortDirection; + showPerPageOptions?: boolean; + + // onChange handlers + onChangeRenderedItems?: (renderedItems: T[]) => void; + onChangeSorting?: (sorting: TableOptions['sort']) => void; + + // sorting + sortItems?: boolean; + sortFn?: SortFunction; + + tableLayout?: 'auto' | 'fixed'; + tableSearchBar?: TableSearchBar; + saveTableOptionsToUrl?: boolean; +}) { + const [searchQuery, setSearchQuery] = useState(''); const history = useHistory(); + const { core } = useApmPluginContext(); + const isTableSearchBarEnabled = core.uiSettings.get( + apmEnableTableSearchBar, + false + ); + const { items, columns, + noItemsMessage, + isLoading = false, + error = false, + + // pagination + pagination = true, initialPageIndex = 0, - initialPageSize, + initialPageSize = 10, initialSortField = props.columns[0]?.field || '', initialSortDirection = 'asc', showPerPageOptions = true, - noItemsMessage, + + // onChange handlers + onChangeRenderedItems = () => {}, + onChangeSorting = () => {}, + + // sorting sortItems = true, sortFn = defaultSortFn, - pagination = true, - isLoading = false, - error = false, + + saveTableOptionsToUrl = true, tableLayout, + tableSearchBar = { + isEnabled: false, + fieldsToSearch: [], + maxCountExceeded: false, + placeholder: 'Search...', + onChangeSearchQuery: () => {}, + }, } = props; const { urlParams: { - page = initialPageIndex, - pageSize = initialPageSize, - sortField = initialSortField, - sortDirection = initialSortDirection, + page: urlPageIndex = initialPageIndex, + pageSize: urlPageSize = initialPageSize, + sortField: urlSortField = initialSortField, + sortDirection: urlSortDirection = initialSortDirection, }, } = useLegacyUrlParams(); - const renderedItems = useMemo(() => { - const sortedItems = sortItems - ? sortFn(items, sortField, sortDirection as 'asc' | 'desc') - : items; - - return sortedItems.slice(page * pageSize, (page + 1) * pageSize); - }, [page, pageSize, sortField, sortDirection, items, sortItems, sortFn]); - - const sort = useMemo(() => { - return { + const getStateFromUrl = useCallback( + (): TableOptions => ({ + page: { index: urlPageIndex, size: urlPageSize }, sort: { - field: sortField as keyof T, - direction: sortDirection as 'asc' | 'desc', + field: urlSortField as keyof T, + direction: urlSortDirection as SortDirection, }, - }; - }, [sortField, sortDirection]); + }), + [urlPageIndex, urlPageSize, urlSortField, urlSortDirection] + ); + + // initialise table options state from url params + const [tableOptions, setTableOptions] = useState(getStateFromUrl()); + // update table options state when url params change + useEffect(() => setTableOptions(getStateFromUrl()), [getStateFromUrl]); + + // update table options state when `onTableChange` is invoked and persist to url const onTableChange = useCallback( - (options: { - page: { index: number; size: number }; - sort?: { field: keyof T; direction: 'asc' | 'desc' }; - }) => { - history.push({ - ...history.location, - search: fromQuery({ - ...toQuery(history.location.search), - page: options.page.index, - pageSize: options.page.size, - sortField: options.sort?.field, - sortDirection: options.sort?.direction, - }), - }); + (newTableOptions: Partial>) => { + setTableOptions((oldTableOptions) => + merge({}, oldTableOptions, newTableOptions) + ); + + if (saveTableOptionsToUrl) { + history.push({ + ...history.location, + search: fromQuery({ + ...toQuery(history.location.search), + page: newTableOptions.page?.index, + pageSize: newTableOptions.page?.size, + sortField: newTableOptions.sort?.field, + sortDirection: newTableOptions.sort?.direction, + }), + }); + } }, - [history] + [history, saveTableOptionsToUrl, setTableOptions] + ); + + const filteredItems = useMemo(() => { + return isEmpty(searchQuery) + ? items + : getItemsFilteredBySearchQuery({ + items, + fieldsToSearch: tableSearchBar.fieldsToSearch, + searchQuery, + }); + }, [items, searchQuery, tableSearchBar.fieldsToSearch]); + + const renderedItems = useMemo(() => { + const sortedItems = sortItems + ? sortFn( + filteredItems, + tableOptions.sort.field as keyof T, + tableOptions.sort.direction + ) + : filteredItems; + + return sortedItems.slice( + tableOptions.page.index * tableOptions.page.size, + (tableOptions.page.index + 1) * tableOptions.page.size + ); + }, [ + sortItems, + sortFn, + filteredItems, + tableOptions.sort.field, + tableOptions.sort.direction, + tableOptions.page.index, + tableOptions.page.size, + ]); + + useEffect(() => { + onChangeRenderedItems(renderedItems); + }, [onChangeRenderedItems, renderedItems]); + + const sorting = useMemo( + () => ({ sort: tableOptions.sort as TableOptions['sort'] }), + [tableOptions.sort] ); + useEffect(() => onChangeSorting(sorting.sort), [onChangeSorting, sorting]); + const paginationProps = useMemo(() => { if (!pagination) { return; } return { showPerPageOptions, - totalItemCount: items.length, - pageIndex: page, - pageSize, + totalItemCount: filteredItems.length, + pageIndex: tableOptions.page.index, + pageSize: tableOptions.page.size, pageSizeOptions: PAGE_SIZE_OPTIONS, }; - }, [showPerPageOptions, items, page, pageSize, pagination]); + }, [ + pagination, + showPerPageOptions, + filteredItems.length, + tableOptions.page.index, + tableOptions.page.size, + ]); - const showNoItemsMessage = useMemo(() => { - return isLoading - ? i18n.translate('xpack.apm.managedTable.loadingDescription', { - defaultMessage: 'Loading…', + const onChangeSearchQuery = useCallback( + (value: string) => { + setSearchQuery(value); + if ( + shouldfetchServer({ + maxCountExceeded: tableSearchBar.maxCountExceeded, + newSearchQuery: value, + oldSearchQuery: searchQuery, }) - : noItemsMessage; - }, [isLoading, noItemsMessage]); + ) { + tableSearchBar.onChangeSearchQuery(value); + } + }, + [searchQuery, tableSearchBar] + ); + + const isSearchBarEnabled = + isTableSearchBarEnabled && (tableSearchBar.isEnabled ?? true); return ( - // @ts-expect-error TS thinks pagination should be non-nullable, but it's not - >} // EuiBasicTableColumn is stricter than ITableColumn - sorting={sort} - onChange={onTableChange} - {...(paginationProps ? { pagination: paginationProps } : {})} - /> + <> + {isSearchBarEnabled ? ( + + ) : null} + + + loading={isLoading} + tableLayout={tableLayout} + error={ + error + ? i18n.translate('xpack.apm.managedTable.errorMessage', { + defaultMessage: 'Failed to fetch', + }) + : '' + } + noItemsMessage={ + isLoading + ? i18n.translate('xpack.apm.managedTable.loadingDescription', { + defaultMessage: 'Loading…', + }) + : noItemsMessage + } + items={renderedItems} + columns={columns as unknown as Array>} // EuiBasicTableColumn is stricter than ITableColumn + sorting={sorting} + onChange={onTableChange} + {...(paginationProps ? { pagination: paginationProps } : {})} + /> + ); } diff --git a/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx b/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx index a43d78887ec9f..5bc6199aba22d 100644 --- a/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx @@ -5,56 +5,62 @@ * 2.0. */ -import { shallow } from 'enzyme'; -import React from 'react'; -import { ITableColumn, UnoptimizedManagedTable } from '.'; - -interface Person { - name: string; - age: number; -} +import { shouldfetchServer } from '.'; describe('ManagedTable', () => { - const people: Person[] = [ - { name: 'Jess', age: 29 }, - { name: 'Becky', age: 43 }, - { name: 'Thomas', age: 31 }, - ]; - const columns: Array> = [ - { - field: 'name', - name: 'Name', - sortable: true, - render: (name) => `Name: ${name}`, - }, - { field: 'age', name: 'Age', render: (age) => `Age: ${age}` }, - ]; + describe('shouldfetchServer', () => { + it('returns true if maxCountExceeded is true', () => { + const result = shouldfetchServer({ + maxCountExceeded: true, + newSearchQuery: 'apple', + oldSearchQuery: 'banana', + }); + expect(result).toBeTruthy(); + }); - it('should render a page-full of items, with defaults', () => { - expect( - shallow( - - columns={columns} - items={people} - initialPageSize={25} - /> - ) - ).toMatchSnapshot(); - }); + it('returns true if newSearchQuery does not include oldSearchQuery', () => { + const result = shouldfetchServer({ + maxCountExceeded: false, + newSearchQuery: 'grape', + oldSearchQuery: 'banana', + }); + expect(result).toBeTruthy(); + }); + + it('returns false if maxCountExceeded is false and newSearchQuery includes oldSearchQuery', () => { + const result = shouldfetchServer({ + maxCountExceeded: false, + newSearchQuery: 'banana', + oldSearchQuery: 'ban', + }); + expect(result).toBeFalsy(); + }); + + it('returns true if maxCountExceeded is true even if newSearchQuery includes oldSearchQuery', () => { + const result = shouldfetchServer({ + maxCountExceeded: true, + newSearchQuery: 'banana', + oldSearchQuery: 'ban', + }); + expect(result).toBeTruthy(); + }); + + it('returns true if maxCountExceeded is true and newSearchQuery is empty', () => { + const result = shouldfetchServer({ + maxCountExceeded: true, + newSearchQuery: '', + oldSearchQuery: 'banana', + }); + expect(result).toBeTruthy(); + }); - it('should render when specifying initial values', () => { - expect( - shallow( - - columns={columns} - items={people} - initialSortField="age" - initialSortDirection="desc" - initialPageIndex={1} - initialPageSize={2} - showPerPageOptions={false} - /> - ) - ).toMatchSnapshot(); + it('returns false if maxCountExceeded is false and both search queries are empty', () => { + const result = shouldfetchServer({ + maxCountExceeded: false, + newSearchQuery: '', + oldSearchQuery: '', + }); + expect(result).toBeFalsy(); + }); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx index cec958da0eb70..de17d0ccf6d4b 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx @@ -52,6 +52,14 @@ function Wrapper({ children }: { children?: ReactNode }) { } describe('ServiceIcons', () => { + beforeAll(() => { + // Mocks console.warn so it won't polute tests output when testing the api throwing error + jest.spyOn(console, 'warn').mockImplementation(() => null); + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); describe('icons', () => { it('Shows loading spinner while fetching data', () => { jest.spyOn(fetcherHook, 'useFetcher').mockReturnValue({ diff --git a/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.test.ts b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.test.ts new file mode 100644 index 0000000000000..ebbd5031c6380 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.test.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { getItemsFilteredBySearchQuery } from './table_search_bar'; + +describe('getItemsFilteredBySearchQuery', () => { + const sampleItems = [ + { name: 'Apple', category: 'Fruit' }, + { name: 'Banana', category: 'Fruit' }, + { name: 'Carrot', category: 'Vegetable' }, + ]; + + it('should filter items based on full match', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['name'], + searchQuery: 'Banana', + }); + expect(result).toEqual([{ name: 'Banana', category: 'Fruit' }]); + }); + + it('should filter items based on partial match', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['name'], + searchQuery: 'car', + }); + expect(result).toEqual([{ name: 'Carrot', category: 'Vegetable' }]); + }); + + it('should be case-insensitive', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['category'], + searchQuery: 'fruit', + }); + expect(result).toEqual([ + { name: 'Apple', category: 'Fruit' }, + { name: 'Banana', category: 'Fruit' }, + ]); + }); + + it('should handle undefined field values', () => { + const itemsWithUndefined = [ + { name: 'Apple', category: 'Fruit' }, + { name: 'Banana', category: undefined }, + ]; + const result = getItemsFilteredBySearchQuery({ + items: itemsWithUndefined, + fieldsToSearch: ['category'], + searchQuery: 'fruit', + }); + expect(result).toEqual([{ name: 'Apple', category: 'Fruit' }]); + }); + + it('should return an empty array if no match is found', () => { + const result = getItemsFilteredBySearchQuery({ + items: sampleItems, + fieldsToSearch: ['name'], + searchQuery: 'Grapes', + }); + expect(result).toEqual([]); + }); +}); diff --git a/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.tsx b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.tsx new file mode 100644 index 0000000000000..7ff7322c98354 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/table_search_bar/table_search_bar.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { EuiFieldSearch } from '@elastic/eui'; +import React from 'react'; + +interface Props { + placeholder: string; + searchQuery: string; + onChangeSearchQuery: (value: string) => void; +} + +export function TableSearchBar({ + placeholder, + searchQuery, + onChangeSearchQuery, +}: Props) { + return ( + { + onChangeSearchQuery(e.target.value); + }} + /> + ); +} + +export function getItemsFilteredBySearchQuery({ + items, + fieldsToSearch, + searchQuery, +}: { + items: T[]; + fieldsToSearch: P[]; + searchQuery: string; +}) { + return items.filter((item) => { + return fieldsToSearch.some((field) => { + const fieldValue = item[field] as unknown as string | undefined; + return fieldValue?.toLowerCase().includes(searchQuery.toLowerCase()); + }); + }); +} diff --git a/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx b/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx index 32329b81a1edb..083fd1e42f5f4 100644 --- a/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx @@ -7,7 +7,6 @@ import { EuiBadge, - EuiBasicTableColumn, EuiFlexGroup, EuiFlexItem, EuiIcon, @@ -42,6 +41,7 @@ import { TRANSACTION_TYPE, } from '../../../../common/es_fields/apm'; import { fieldValuePairToKql } from '../../../../common/utils/field_value_pair_to_kql'; +import { ITableColumn } from '../managed_table'; type TransactionGroupMainStatistics = APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics'>; @@ -55,8 +55,8 @@ type TransactionGroupDetailedStatistics = export function getColumns({ serviceName, latencyAggregationType, - transactionGroupDetailedStatisticsLoading, - transactionGroupDetailedStatistics, + detailedStatisticsLoading, + detailedStatistics, comparisonEnabled, shouldShowSparkPlots = true, showAlertsColumn, @@ -67,8 +67,8 @@ export function getColumns({ }: { serviceName: string; latencyAggregationType?: LatencyAggregationType; - transactionGroupDetailedStatisticsLoading: boolean; - transactionGroupDetailedStatistics?: TransactionGroupDetailedStatistics; + detailedStatisticsLoading: boolean; + detailedStatistics?: TransactionGroupDetailedStatistics; comparisonEnabled?: boolean; shouldShowSparkPlots?: boolean; showAlertsColumn: boolean; @@ -76,7 +76,7 @@ export function getColumns({ transactionOverflowCount: number; link: any; query: TypeOf['query']; -}): Array> { +}): Array> { return [ ...(showAlertsColumn ? [ @@ -128,7 +128,7 @@ export function getColumns({ ); }, - } as EuiBasicTableColumn, + } as ITableColumn, ] : []), { @@ -162,20 +162,18 @@ export function getColumns({ align: RIGHT_ALIGNMENT, render: (_, { latency, name }) => { const currentTimeseries = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.latency; + detailedStatistics?.currentPeriod?.[name]?.latency; const previousTimeseries = - transactionGroupDetailedStatistics?.previousPeriod?.[name]?.latency; - + detailedStatistics?.previousPeriod?.[name]?.latency; const { currentPeriodColor, previousPeriodColor } = getTimeSeriesColor( ChartType.LATENCY_AVG ); - return ( { const currentTimeseries = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.throughput; + detailedStatistics?.currentPeriod?.[name]?.throughput; const previousTimeseries = - transactionGroupDetailedStatistics?.previousPeriod?.[name] - ?.throughput; - + detailedStatistics?.previousPeriod?.[name]?.throughput; const { currentPeriodColor, previousPeriodColor } = getTimeSeriesColor( ChartType.THROUGHPUT ); - return ( { const currentTimeseries = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.errorRate; + detailedStatistics?.currentPeriod?.[name]?.errorRate; const previousTimeseries = - transactionGroupDetailedStatistics?.previousPeriod?.[name]?.errorRate; - + detailedStatistics?.previousPeriod?.[name]?.errorRate; const { currentPeriodColor, previousPeriodColor } = getTimeSeriesColor( ChartType.FAILED_TRANSACTION_RATE ); - return ( { const currentImpact = - transactionGroupDetailedStatistics?.currentPeriod?.[name]?.impact ?? - 0; + detailedStatistics?.currentPeriod?.[name]?.impact ?? 0; const previousImpact = - transactionGroupDetailedStatistics?.previousPeriod?.[name]?.impact; + detailedStatistics?.previousPeriod?.[name]?.impact; return ( diff --git a/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx b/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx index bd0e4f242cf39..e4553dfee073a 100644 --- a/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx @@ -5,19 +5,12 @@ * 2.0. */ -import { - EuiBasicTable, - EuiCallOut, - EuiFlexGroup, - EuiFlexItem, - EuiTitle, -} from '@elastic/eui'; +import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { v4 as uuidv4 } from 'uuid'; import { FormattedMessage } from '@kbn/i18n-react'; -import { orderBy } from 'lodash'; +import { compact } from 'lodash'; import React, { useMemo, useState } from 'react'; -import { useHistory } from 'react-router-dom'; -import { v4 as uuidv4 } from 'uuid'; import { ApmDocumentType } from '../../../../common/document_type'; import { getLatencyAggregationType, @@ -27,6 +20,7 @@ import { useApmServiceContext } from '../../../context/apm_service/use_apm_servi import { useAnyOfApmParams } from '../../../hooks/use_apm_params'; import { useApmRouter } from '../../../hooks/use_apm_router'; import { useBreakpoints } from '../../../hooks/use_breakpoints'; +import { useStateDebounced } from '../../../hooks/use_debounce'; import { FETCH_STATUS, isPending, @@ -35,7 +29,7 @@ import { import { usePreferredDataSourceAndBucketSize } from '../../../hooks/use_preferred_data_source_and_bucket_size'; import { APIReturnType } from '../../../services/rest/create_call_apm_api'; import { TransactionOverviewLink } from '../links/apm/transaction_overview_link'; -import { fromQuery, toQuery } from '../links/url_helpers'; +import { ManagedTable, TableSearchBar } from '../managed_table'; import { OverviewTableContainer } from '../overview_table_container'; import { isTimeComparison } from '../time_comparison/get_comparison_options'; import { getColumns } from './get_columns'; @@ -43,29 +37,12 @@ import { getColumns } from './get_columns'; type ApiResponse = APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics'>; -interface InitialState { - requestId: string; - mainStatisticsData: ApiResponse & { - transactionGroupsTotalItems: number; - }; -} - -const INITIAL_STATE: InitialState = { +const INITIAL_STATE: ApiResponse & { requestId: string } = { requestId: '', - mainStatisticsData: { - transactionGroups: [], - maxTransactionGroupsExceeded: false, - transactionOverflowCount: 0, - transactionGroupsTotalItems: 0, - hasActiveAlerts: false, - }, -}; - -type SortField = 'name' | 'latency' | 'throughput' | 'errorRate' | 'impact'; -type SortDirection = 'asc' | 'desc'; -const DEFAULT_SORT = { - direction: 'desc' as const, - field: 'impact' as const, + transactionGroups: [], + maxCountExceeded: false, + transactionOverflowCount: 0, + hasActiveAlerts: false, }; interface Props { @@ -88,7 +65,7 @@ export function TransactionsTable({ hideViewTransactionsLink = false, hideTitle = false, isSingleColumn = true, - numberOfTransactionsPerPage = 5, + numberOfTransactionsPerPage = 10, showPerPageOptions = true, showMaxTransactionGroupsExceededWarning = false, environment, @@ -97,7 +74,6 @@ export function TransactionsTable({ end, saveTableOptionsToUrl = false, }: Props) { - const history = useHistory(); const { link } = useApmRouter(); const { @@ -106,10 +82,6 @@ export function TransactionsTable({ comparisonEnabled, offset, latencyAggregationType: latencyAggregationTypeFromQuery, - page: urlPage = 0, - pageSize: urlPageSize = numberOfTransactionsPerPage, - sortField: urlSortField = 'impact', - sortDirection: urlSortDirection = 'desc', }, } = useAnyOfApmParams( '/services/{serviceName}/transactions', @@ -122,192 +94,75 @@ export function TransactionsTable({ latencyAggregationTypeFromQuery ); - const [tableOptions, setTableOptions] = useState<{ - page: { index: number; size: number }; - sort: { direction: SortDirection; field: SortField }; - }>({ - page: { index: urlPage, size: urlPageSize }, - sort: { - field: urlSortField as SortField, - direction: urlSortDirection as SortDirection, - }, - }); - // SparkPlots should be hidden if we're in two-column view and size XL (1200px) const { isXl } = useBreakpoints(); const shouldShowSparkPlots = isSingleColumn || !isXl; - - const { page, sort } = tableOptions; - const { direction, field } = sort; - const { index, size } = page; - const { transactionType, serviceName } = useApmServiceContext(); + const [searchQuery, setSearchQueryDebounced] = useStateDebounced(''); - const preferred = usePreferredDataSourceAndBucketSize({ - start, + const [renderedItems, setRenderedItems] = useState< + ApiResponse['transactionGroups'] + >([]); + + const { + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + } = useTableData({ + comparisonEnabled, + currentPageItems: renderedItems, end, + environment, kuery, - numBuckets: 20, - type: ApmDocumentType.TransactionMetric, + latencyAggregationType, + offset, + searchQuery, + serviceName, + start, + transactionType, }); - const shouldUseDurationSummary = - latencyAggregationType === 'avg' && - preferred?.source?.hasDurationSummaryField; - - const { data = INITIAL_STATE, status } = useFetcher( - (callApmApi) => { - if (!latencyAggregationType || !transactionType || !preferred) { - return Promise.resolve(undefined); - } - return callApmApi( - 'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - transactionType, - useDurationSummary: !!shouldUseDurationSummary, - latencyAggregationType: - latencyAggregationType as LatencyAggregationType, - documentType: preferred.source.documentType, - rollupInterval: preferred.source.rollupInterval, - }, - }, - } - ).then((response) => { - const currentPageTransactionGroups = orderBy( - response.transactionGroups, - [field], - [direction] - ).slice(index * size, (index + 1) * size); - - return { - // Everytime the main statistics is refetched, updates the requestId making the detailed API to be refetched. - requestId: uuidv4(), - mainStatisticsData: { - ...response, - transactionGroups: currentPageTransactionGroups, - transactionGroupsTotalItems: response.transactionGroups.length, - }, - }; - }); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [ - environment, - kuery, + const columns = useMemo(() => { + return getColumns({ serviceName, - start, - end, - transactionType, - latencyAggregationType, - index, - size, - direction, - field, - // not used, but needed to trigger an update when offset is changed either manually by user or when time range is changed - offset, - // not used, but needed to trigger an update when comparison feature is disabled/enabled by user + latencyAggregationType: latencyAggregationType as LatencyAggregationType, + detailedStatisticsLoading: isPending(detailedStatisticsStatus), + detailedStatistics, comparisonEnabled, - preferred, - ] - ); - - const { - requestId, - mainStatisticsData: { - transactionGroups, - maxTransactionGroupsExceeded, - transactionOverflowCount, - transactionGroupsTotalItems, - hasActiveAlerts, - }, - } = data; - - const { - data: transactionGroupDetailedStatistics, - status: transactionGroupDetailedStatisticsStatus, - } = useFetcher( - (callApmApi) => { - if ( - transactionGroupsTotalItems && - start && - end && - transactionType && - latencyAggregationType && - preferred - ) { - return callApmApi( - 'GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics', - { - params: { - path: { serviceName }, - query: { - environment, - kuery, - start, - end, - bucketSizeInSeconds: preferred.bucketSizeInSeconds, - transactionType, - documentType: preferred.source.documentType, - rollupInterval: preferred.source.rollupInterval, - useDurationSummary: !!shouldUseDurationSummary, - latencyAggregationType: - latencyAggregationType as LatencyAggregationType, - transactionNames: JSON.stringify( - transactionGroups.map(({ name }) => name).sort() - ), - offset: - comparisonEnabled && isTimeComparison(offset) - ? offset - : undefined, - }, - }, - } - ); - } - }, - // only fetches detailed statistics when requestId is invalidated by main statistics api call - // eslint-disable-next-line react-hooks/exhaustive-deps - [requestId], - { preservePreviousData: false } - ); - - const columns = getColumns({ - serviceName, - latencyAggregationType: latencyAggregationType as LatencyAggregationType, - transactionGroupDetailedStatisticsLoading: isPending( - transactionGroupDetailedStatisticsStatus - ), - transactionGroupDetailedStatistics, + shouldShowSparkPlots, + offset, + transactionOverflowCount: mainStatistics.transactionOverflowCount, + showAlertsColumn: mainStatistics.hasActiveAlerts, + link, + query, + }); + }, [ comparisonEnabled, - shouldShowSparkPlots, - offset, - transactionOverflowCount, - showAlertsColumn: hasActiveAlerts, + detailedStatistics, + detailedStatisticsStatus, + latencyAggregationType, link, + mainStatistics.hasActiveAlerts, + mainStatistics.transactionOverflowCount, + offset, query, - }); - - const pagination = useMemo( - () => ({ - pageIndex: index, - pageSize: size, - totalItemCount: transactionGroupsTotalItems, - showPerPageOptions, - }), - [index, size, transactionGroupsTotalItems, showPerPageOptions] - ); + serviceName, + shouldShowSparkPlots, + ]); - const sorting = useMemo( - () => ({ sort: { field, direction } }), - [field, direction] - ); + const tableSearchBar: TableSearchBar = + useMemo(() => { + return { + fieldsToSearch: ['name'], + maxCountExceeded: mainStatistics.maxCountExceeded, + onChangeSearchQuery: setSearchQueryDebounced, + placeholder: i18n.translate( + 'xpack.apm.transactionsTable.tableSearch.placeholder', + { defaultMessage: 'Search transactions by name' } + ), + }; + }, [mainStatistics.maxCountExceeded, setSearchQueryDebounced]); return ( )} - {showMaxTransactionGroupsExceededWarning && maxTransactionGroupsExceeded && ( - - -

- -

-
-
- )} + {showMaxTransactionGroupsExceededWarning && + mainStatistics.maxCountExceeded && ( + + +

+ +

+
+
+ )} - - + - { - setTableOptions({ - page: { - index: newTableOptions.page?.index ?? 0, - size: - newTableOptions.page?.size ?? numberOfTransactionsPerPage, - }, - sort: newTableOptions.sort - ? { - field: newTableOptions.sort.field as SortField, - direction: newTableOptions.sort.direction, - } - : DEFAULT_SORT, - }); - if (saveTableOptionsToUrl) { - history.push({ - ...history.location, - search: fromQuery({ - ...toQuery(history.location.search), - page: newTableOptions.page?.index, - pageSize: newTableOptions.page?.size, - sortField: newTableOptions.sort?.field, - sortDirection: newTableOptions.sort?.direction, - }), - }); - } - }} - /> - - + items={mainStatistics.transactionGroups} + columns={columns} + initialSortField="impact" + initialSortDirection="desc" + initialPageSize={numberOfTransactionsPerPage} + isLoading={mainStatisticsStatus === FETCH_STATUS.LOADING} + tableSearchBar={tableSearchBar} + showPerPageOptions={showPerPageOptions} + onChangeRenderedItems={setRenderedItems} + saveTableOptionsToUrl={saveTableOptionsToUrl} + /> +
); } + +function useTableData({ + comparisonEnabled, + currentPageItems, + end, + environment, + kuery, + latencyAggregationType, + offset, + searchQuery, + serviceName, + start, + transactionType, +}: { + comparisonEnabled: boolean | undefined; + currentPageItems: ApiResponse['transactionGroups']; + end: string; + environment: string; + kuery: string; + latencyAggregationType: LatencyAggregationType | undefined; + offset: string | undefined; + searchQuery: string; + serviceName: string; + start: string; + transactionType: string | undefined; +}) { + const preferredDataSource = usePreferredDataSourceAndBucketSize({ + start, + end, + kuery, + numBuckets: 20, + type: ApmDocumentType.TransactionMetric, + }); + + const shouldUseDurationSummary = + latencyAggregationType === 'avg' && + preferredDataSource?.source?.hasDurationSummaryField; + + const { data: mainStatistics = INITIAL_STATE, status: mainStatisticsStatus } = + useFetcher( + (callApmApi) => { + if ( + !latencyAggregationType || + !transactionType || + !preferredDataSource + ) { + return Promise.resolve(undefined); + } + return callApmApi( + 'GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + transactionType, + useDurationSummary: !!shouldUseDurationSummary, + latencyAggregationType: + latencyAggregationType as LatencyAggregationType, + documentType: preferredDataSource.source.documentType, + rollupInterval: preferredDataSource.source.rollupInterval, + searchQuery, + }, + }, + } + ).then((mainStatisticsData) => { + return { requestId: uuidv4(), ...mainStatisticsData }; + }); + }, + [ + searchQuery, + end, + environment, + kuery, + latencyAggregationType, + preferredDataSource, + serviceName, + shouldUseDurationSummary, + start, + transactionType, + ] + ); + + const { data: detailedStatistics, status: detailedStatisticsStatus } = + useFetcher( + (callApmApi) => { + const transactionNames = compact( + currentPageItems.map(({ name }) => name) + ); + if ( + start && + end && + transactionType && + latencyAggregationType && + preferredDataSource && + transactionNames.length > 0 + ) { + return callApmApi( + 'GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics', + { + params: { + path: { serviceName }, + query: { + environment, + kuery, + start, + end, + bucketSizeInSeconds: preferredDataSource.bucketSizeInSeconds, + transactionType, + documentType: preferredDataSource.source.documentType, + rollupInterval: preferredDataSource.source.rollupInterval, + useDurationSummary: !!shouldUseDurationSummary, + latencyAggregationType: + latencyAggregationType as LatencyAggregationType, + transactionNames: JSON.stringify(transactionNames.sort()), + offset: + comparisonEnabled && isTimeComparison(offset) + ? offset + : undefined, + }, + }, + } + ); + } + }, + // only fetches detailed statistics when `currentPageItems` is updated. + // eslint-disable-next-line react-hooks/exhaustive-deps + [mainStatistics.requestId, currentPageItems, offset, comparisonEnabled], + { preservePreviousData: false } + ); + + return { + mainStatistics, + mainStatisticsStatus, + detailedStatistics, + detailedStatisticsStatus, + }; +} diff --git a/x-pack/plugins/apm/public/hooks/use_debounce.test.tsx b/x-pack/plugins/apm/public/hooks/use_debounce.test.tsx new file mode 100644 index 0000000000000..6701024eea9e9 --- /dev/null +++ b/x-pack/plugins/apm/public/hooks/use_debounce.test.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { renderHook, act } from '@testing-library/react-hooks'; +import { useStateDebounced } from './use_debounce'; // Replace 'your-module' with the actual module path + +describe('useStateDebounced', () => { + jest.useFakeTimers(); + beforeAll(() => { + // Mocks console.error so it won't polute tests output when testing the api throwing error + jest.spyOn(console, 'error').mockImplementation(() => null); + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); + + it('returns the initial value and a debounced setter function', () => { + const { result } = renderHook(() => useStateDebounced('initialValue', 300)); + + const [debouncedValue, setValueDebounced] = result.current; + + expect(debouncedValue).toBe('initialValue'); + expect(typeof setValueDebounced).toBe('function'); + }); + + it('updates debounced value after a delay when setter function is called', () => { + const { result } = renderHook(() => useStateDebounced('initialValue')); + + act(() => { + result.current[1]('updatedValue'); + }); + expect(result.current[0]).toBe('initialValue'); + jest.advanceTimersByTime(300); + expect(result.current[0]).toBe('updatedValue'); + }); + + it('cancels previous debounced updates when new ones occur', () => { + const { result } = renderHook(() => useStateDebounced('initialValue', 400)); + + act(() => { + result.current[1]('updatedValue'); + }); + jest.advanceTimersByTime(150); + expect(result.current[0]).toBe('initialValue'); + act(() => { + result.current[1]('newUpdatedValue'); + }); + jest.advanceTimersByTime(400); + expect(result.current[0]).toBe('newUpdatedValue'); + }); +}); diff --git a/x-pack/plugins/apm/public/hooks/use_debounce.tsx b/x-pack/plugins/apm/public/hooks/use_debounce.tsx new file mode 100644 index 0000000000000..1aa2276e901b2 --- /dev/null +++ b/x-pack/plugins/apm/public/hooks/use_debounce.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 { debounce } from 'lodash'; +import { useCallback, useState } from 'react'; + +export function useStateDebounced( + initialValue: T, + debounceDelay: number = 300 +) { + const [debouncedValue, setValue] = useState(initialValue); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const setValueDebounced = useCallback(debounce(setValue, debounceDelay), [ + setValue, + debounceDelay, + ]); + + return [debouncedValue, setValueDebounced] as const; +} 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 bc8a2056cb41c..66e4fa63ce620 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 @@ -65,5 +65,8 @@ export function useErrorGroupDistributionFetcher({ ] ); - return { errorDistributionData: data, status }; + return { + errorDistributionData: data, + errorDistributionStatus: status, + }; } diff --git a/x-pack/plugins/apm/public/hooks/use_fetcher.tsx b/x-pack/plugins/apm/public/hooks/use_fetcher.tsx index df4da04651228..cfa65e001def7 100644 --- a/x-pack/plugins/apm/public/hooks/use_fetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/use_fetcher.tsx @@ -30,6 +30,12 @@ export const isPending = (fetchStatus: FETCH_STATUS) => fetchStatus === FETCH_STATUS.LOADING || fetchStatus === FETCH_STATUS.NOT_INITIATED; +export const isFailure = (fetchStatus: FETCH_STATUS) => + fetchStatus === FETCH_STATUS.FAILURE; + +export const isSuccess = (fetchStatus: FETCH_STATUS) => + fetchStatus === FETCH_STATUS.SUCCESS; + export interface FetcherResult { data?: Data; status: FETCH_STATUS; diff --git a/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts b/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts index be99a537de011..348d84883ba87 100644 --- a/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts +++ b/x-pack/plugins/apm/public/hooks/use_preferred_data_source_and_bucket_size.ts @@ -18,6 +18,7 @@ import { useTimeRangeMetadata } from '../context/time_range_metadata/use_time_ra * @param {number} numBuckets - The number of buckets. Should be 20 for SparkPlots or 100 for Other charts. */ + export function usePreferredDataSourceAndBucketSize< TDocumentType extends | ApmDocumentType.ServiceTransactionMetric diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts index 0017e94863828..4192d35d796f3 100644 --- a/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts @@ -8,6 +8,9 @@ import type { ESSearchRequest, ESSearchResponse } from '@kbn/es-types'; import { MlClient } from '../helpers/get_ml_client'; +export const ML_SERVICE_NAME_FIELD = 'partition_field_value'; +export const ML_TRANSACTION_TYPE_FIELD = 'by_field_value'; + interface SharedFields { job_id: string; bucket_span: number; @@ -44,9 +47,9 @@ type AnomalyDocument = MlRecord | MlModelPlot; export async function anomalySearch( mlAnomalySearch: Required['mlSystem']['mlAnomalySearch'], - params: TParams + params: TParams, + jobsIds = [] // pass an empty array of job ids to anomaly search so any validation is skipped ): Promise> { - const response = await mlAnomalySearch(params, []); - + const response = await mlAnomalySearch(params, jobsIds); return response as unknown as ESSearchResponse; } diff --git a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts index 182fe0a1cdd8a..6c8d878502b7a 100644 --- a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts +++ b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts @@ -10,6 +10,7 @@ import { kqlQuery, rangeQuery, termQuery, + wildcardQuery, } from '@kbn/observability-plugin/server'; import { ERROR_CULPRIT, @@ -17,6 +18,7 @@ import { ERROR_EXC_MESSAGE, ERROR_EXC_TYPE, ERROR_GROUP_ID, + ERROR_GROUP_NAME, ERROR_LOG_MESSAGE, SERVICE_NAME, TRANSACTION_NAME, @@ -28,15 +30,18 @@ import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm import { ApmDocumentType } from '../../../../common/document_type'; import { RollupInterval } from '../../../../common/rollup'; -export type ErrorGroupMainStatisticsResponse = Array<{ - groupId: string; - name: string; - lastSeen: number; - occurrences: number; - culprit: string | undefined; - handled: boolean | undefined; - type: string | undefined; -}>; +export interface ErrorGroupMainStatisticsResponse { + errorGroups: Array<{ + groupId: string; + name: string; + lastSeen: number; + occurrences: number; + culprit: string | undefined; + handled: boolean | undefined; + type: string | undefined; + }>; + maxCountExceeded: boolean; +} export async function getErrorGroupMainStatistics({ kuery, @@ -50,6 +55,7 @@ export async function getErrorGroupMainStatistics({ maxNumberOfErrorGroups = 500, transactionName, transactionType, + searchQuery, }: { kuery: string; serviceName: string; @@ -62,6 +68,7 @@ export async function getErrorGroupMainStatistics({ maxNumberOfErrorGroups?: number; transactionName?: string; transactionType?: string; + searchQuery?: string; }): Promise { // sort buckets by last occurrence of error const sortByLatestOccurrence = sortField === 'lastSeen'; @@ -72,6 +79,19 @@ export async function getErrorGroupMainStatistics({ ? { [maxTimestampAggKey]: sortDirection } : { _count: sortDirection }; + const shouldQuery = searchQuery + ? { + should: [ + ERROR_LOG_MESSAGE, + ERROR_EXC_MESSAGE, + ERROR_GROUP_NAME, + ERROR_EXC_TYPE, + ERROR_CULPRIT, + ].flatMap((field) => wildcardQuery(field, searchQuery)), + minimum_should_match: 1, + } + : {}; + const response = await apmEventClient.search( 'get_error_group_main_statistics', { @@ -96,6 +116,7 @@ export async function getErrorGroupMainStatistics({ ...environmentQuery(environment), ...kqlQuery(kuery), ], + ...shouldQuery, }, }, aggs: { @@ -133,7 +154,10 @@ export async function getErrorGroupMainStatistics({ } ); - return ( + const maxCountExceeded = + (response.aggregations?.error_groups.sum_other_doc_count ?? 0) > 0; + + const errorGroups = response.aggregations?.error_groups.buckets.map((bucket) => { return { groupId: bucket.key as string, @@ -147,6 +171,10 @@ export async function getErrorGroupMainStatistics({ bucket.sample.hits.hits[0]._source.error.exception?.[0].handled, type: bucket.sample.hits.hits[0]._source.error.exception?.[0].type, }; - }) ?? [] - ); + }) ?? []; + + return { + errorGroups, + maxCountExceeded, + }; } diff --git a/x-pack/plugins/apm/server/routes/errors/route.ts b/x-pack/plugins/apm/server/routes/errors/route.ts index a3e11887f1caf..a76ab1df8a9b1 100644 --- a/x-pack/plugins/apm/server/routes/errors/route.ts +++ b/x-pack/plugins/apm/server/routes/errors/route.ts @@ -47,6 +47,7 @@ const errorsMainStatisticsRoute = createApmServerRoute({ t.partial({ sortField: t.string, sortDirection: t.union([t.literal('asc'), t.literal('desc')]), + searchQuery: t.string, }), environmentRt, kueryRt, @@ -54,16 +55,21 @@ const errorsMainStatisticsRoute = createApmServerRoute({ ]), }), options: { tags: ['access:apm'] }, - handler: async ( - resources - ): Promise<{ errorGroups: ErrorGroupMainStatisticsResponse }> => { + handler: async (resources): Promise => { const { params } = resources; const apmEventClient = await getApmEventClient(resources); const { serviceName } = params.path; - const { environment, kuery, sortField, sortDirection, start, end } = - params.query; + const { + environment, + kuery, + sortField, + sortDirection, + start, + end, + searchQuery, + } = params.query; - const errorGroups = await getErrorGroupMainStatistics({ + return await getErrorGroupMainStatistics({ environment, kuery, serviceName, @@ -72,9 +78,8 @@ const errorsMainStatisticsRoute = createApmServerRoute({ apmEventClient, start, end, + searchQuery, }); - - return { errorGroups }; }, }); @@ -97,11 +102,7 @@ const errorsMainStatisticsByTransactionNameRoute = createApmServerRoute({ ]), }), options: { tags: ['access:apm'] }, - handler: async ( - resources - ): Promise<{ - errorGroups: ErrorGroupMainStatisticsResponse; - }> => { + handler: async (resources): Promise => { const { params } = resources; const apmEventClient = await getApmEventClient(resources); const { serviceName } = params.path; @@ -115,7 +116,7 @@ const errorsMainStatisticsByTransactionNameRoute = createApmServerRoute({ maxNumberOfErrorGroups, } = params.query; - const errorGroups = await getErrorGroupMainStatistics({ + return await getErrorGroupMainStatistics({ environment, kuery, serviceName, @@ -126,8 +127,6 @@ const errorsMainStatisticsByTransactionNameRoute = createApmServerRoute({ transactionName, transactionType, }); - - return { errorGroups }; }, }); diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts index d46c43d258166..eb0fb5ed62e05 100644 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts +++ b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts @@ -8,9 +8,8 @@ import Boom from '@hapi/boom'; import { sortBy, uniqBy } from 'lodash'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { ESSearchResponse } from '@kbn/es-types'; import type { MlAnomalyDetectors } from '@kbn/ml-plugin/server'; -import { rangeQuery } from '@kbn/observability-plugin/server'; +import { rangeQuery, wildcardQuery } from '@kbn/observability-plugin/server'; import { getSeverity, ML_ERRORS } from '../../../common/anomaly_detection'; import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; import { getServiceHealthStatus } from '../../../common/service_health_status'; @@ -20,6 +19,11 @@ import { getMlJobsWithAPMGroup } from '../../lib/anomaly_detection/get_ml_jobs_w import { MlClient } from '../../lib/helpers/get_ml_client'; import { apmMlAnomalyQuery } from '../../lib/anomaly_detection/apm_ml_anomaly_query'; import { AnomalyDetectorType } from '../../../common/anomaly_detection/apm_ml_detectors'; +import { + anomalySearch, + ML_SERVICE_NAME_FIELD, + ML_TRANSACTION_TYPE_FIELD, +} from '../../lib/anomaly_detection/anomaly_search'; export const DEFAULT_ANOMALIES: ServiceAnomaliesResponse = { mlJobIds: [], @@ -34,11 +38,13 @@ export async function getServiceAnomalies({ environment, start, end, + searchQuery, }: { mlClient?: MlClient; environment: string; start: number; end: number; + searchQuery?: string; }) { return withApmSpan('get_service_anomalies', async () => { if (!mlClient) { @@ -65,6 +71,7 @@ export async function getServiceAnomalies({ by_field_value: defaultTransactionTypes, }, }, + ...wildcardQuery(ML_SERVICE_NAME_FIELD, searchQuery), ] as estypes.QueryDslQueryContainer[], }, }, @@ -73,7 +80,7 @@ export async function getServiceAnomalies({ composite: { size: 5000, sources: [ - { serviceName: { terms: { field: 'partition_field_value' } } }, + { serviceName: { terms: { field: ML_SERVICE_NAME_FIELD } } }, { jobId: { terms: { field: 'job_id' } } }, ] as Array< Record @@ -84,7 +91,7 @@ export async function getServiceAnomalies({ top_metrics: { metrics: [ { field: 'actual' }, - { field: 'by_field_value' }, + { field: ML_TRANSACTION_TYPE_FIELD }, { field: 'result_type' }, { field: 'record_score' }, ], @@ -100,20 +107,16 @@ export async function getServiceAnomalies({ }; const [anomalyResponse, jobIds] = await Promise.all([ - // pass an empty array of job ids to anomaly search - // so any validation is skipped withApmSpan('ml_anomaly_search', () => - mlClient.mlSystem.mlAnomalySearch(params, []) + anomalySearch(mlClient.mlSystem.mlAnomalySearch, params) ), getMLJobIds(mlClient.anomalyDetectors, environment), ]); - const typedAnomalyResponse: ESSearchResponse = - anomalyResponse as any; const relevantBuckets = uniqBy( sortBy( // make sure we only return data for jobs that are available in this space - typedAnomalyResponse.aggregations?.services.buckets.filter((bucket) => + anomalyResponse.aggregations?.services.buckets.filter((bucket) => jobIds.includes(bucket.key.jobId as string) ) ?? [], // sort by job ID in case there are multiple jobs for one service to diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts index 28401dd0b46b5..95f56520b8ab2 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/detailed_statistics.ts @@ -51,11 +51,11 @@ async function getServiceInstancesDetailedStatistics( const [transactionStats, systemMetricStats = []] = await Promise.all([ getServiceInstancesTransactionStatistics({ ...params, - isComparisonSearch: true, + includeTimeseries: true, }), getServiceInstancesSystemMetricStatistics({ ...params, - isComparisonSearch: true, + includeTimeseries: true, }), ]); diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts index b2925af05946a..775246e5a578d 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_system_metric_statistics.ts @@ -52,7 +52,7 @@ export async function getServiceInstancesSystemMetricStatistics< end, serviceNodeIds, numBuckets, - isComparisonSearch, + includeTimeseries, offset, }: { apmEventClient: APMEventClient; @@ -64,7 +64,7 @@ export async function getServiceInstancesSystemMetricStatistics< environment: string; kuery: string; size?: number; - isComparisonSearch: T; + includeTimeseries: T; offset?: string; }): Promise>> { const { startWithOffset, endWithOffset } = getOffsetInMs({ @@ -85,7 +85,7 @@ export async function getServiceInstancesSystemMetricStatistics< agg: TParams ) { return { - ...(isComparisonSearch + ...(includeTimeseries ? { avg: { avg: agg }, timeseries: { @@ -136,7 +136,7 @@ export async function getServiceInstancesSystemMetricStatistics< ...rangeQuery(startWithOffset, endWithOffset), ...environmentQuery(environment), ...kqlQuery(kuery), - ...(isComparisonSearch && serviceNodeIds + ...(serviceNodeIds?.length ? [{ terms: { [SERVICE_NODE_NAME]: serviceNodeIds } }] : []), { @@ -158,7 +158,7 @@ export async function getServiceInstancesSystemMetricStatistics< field: SERVICE_NODE_NAME, missing: SERVICE_NODE_NAME_MISSING, ...(size ? { size } : {}), - ...(isComparisonSearch ? { include: serviceNodeIds } : {}), + ...(serviceNodeIds?.length ? { include: serviceNodeIds } : {}), }, aggs: subAggs, }, @@ -179,7 +179,7 @@ export async function getServiceInstancesSystemMetricStatistics< : 'memory_usage_system'; const cpuUsage = - // Timeseries is available when isComparisonSearch is true + // Timeseries is available when includeTimeseries is true 'timeseries' in serviceNodeBucket.cpu_usage ? serviceNodeBucket.cpu_usage.timeseries.buckets.map( (dateBucket) => ({ @@ -191,7 +191,7 @@ export async function getServiceInstancesSystemMetricStatistics< const memoryUsageValue = serviceNodeBucket[memoryMetricsKey]; const memoryUsage = - // Timeseries is available when isComparisonSearch is true + // Timeseries is available when includeTimeseries is true 'timeseries' in memoryUsageValue ? memoryUsageValue.timeseries.buckets.map((dateBucket) => ({ x: dateBucket.key, diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts index ab687382e767b..db9392fba1b4b 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts @@ -63,7 +63,7 @@ export async function getServiceInstancesTransactionStatistics< end, serviceNodeIds, numBuckets, - isComparisonSearch, + includeTimeseries, offset, }: { latencyAggregationType: LatencyAggregationType; @@ -73,7 +73,7 @@ export async function getServiceInstancesTransactionStatistics< searchAggregatedTransactions: boolean; start: number; end: number; - isComparisonSearch: T; + includeTimeseries: T; serviceNodeIds?: string[]; environment: string; kuery: string; @@ -123,7 +123,7 @@ export async function getServiceInstancesTransactionStatistics< ...getBackwardCompatibleDocumentTypeFilter( searchAggregatedTransactions ), - ...(isComparisonSearch && serviceNodeIds + ...(serviceNodeIds?.length ? [{ terms: { [SERVICE_NODE_NAME]: serviceNodeIds } }] : []), ], @@ -136,9 +136,9 @@ export async function getServiceInstancesTransactionStatistics< field: SERVICE_NODE_NAME, missing: SERVICE_NODE_NAME_MISSING, ...(size ? { size } : {}), - ...(isComparisonSearch ? { include: serviceNodeIds } : {}), + ...(serviceNodeIds?.length ? { include: serviceNodeIds } : {}), }, - aggs: isComparisonSearch + aggs: includeTimeseries ? { timeseries: { date_histogram: { @@ -174,7 +174,7 @@ export async function getServiceInstancesTransactionStatistics< const { doc_count: count, key } = serviceNodeBucket; const serviceNodeName = String(key); - // Timeseries is returned when isComparisonSearch is true + // Timeseries is returned when includeTimeseries is true if ('timeseries' in serviceNodeBucket) { const { timeseries } = serviceNodeBucket; return { diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts index 16a9499979561..bf567aa98c84c 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/main_statistics.ts @@ -5,10 +5,11 @@ * 2.0. */ +import { keyBy, orderBy } from 'lodash'; +import { InstancesSortField } from '../../../../common/instances'; import { LatencyAggregationType } from '../../../../common/latency_aggregation_types'; -import { joinByKey } from '../../../../common/utils/join_by_key'; -import { withApmSpan } from '../../../utils/with_apm_span'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; +import { withApmSpan } from '../../../utils/with_apm_span'; import { getServiceInstancesSystemMetricStatistics } from './get_service_instances_system_metric_statistics'; import { getServiceInstancesTransactionStatistics } from './get_service_instances_transaction_statistics'; @@ -24,6 +25,8 @@ interface ServiceInstanceMainStatisticsParams { start: number; end: number; offset?: string; + sortField: InstancesSortField; + sortDirection: 'asc' | 'desc'; } export type ServiceInstanceMainStatisticsResponse = Array<{ @@ -35,31 +38,39 @@ export type ServiceInstanceMainStatisticsResponse = Array<{ memoryUsage?: number | null; }>; -export async function getServiceInstancesMainStatistics( - params: Omit -): Promise { +export async function getServiceInstancesMainStatistics({ + sortDirection, + sortField, + ...params +}: Omit< + ServiceInstanceMainStatisticsParams, + 'size' +>): Promise { return withApmSpan('get_service_instances_main_statistics', async () => { const paramsForSubQueries = { ...params, - size: 50, + size: 1000, }; - const [transactionStats, systemMetricStats] = await Promise.all([ - getServiceInstancesTransactionStatistics({ - ...paramsForSubQueries, - isComparisonSearch: false, - }), - getServiceInstancesSystemMetricStatistics({ - ...paramsForSubQueries, - isComparisonSearch: false, - }), - ]); + const transactionStats = await getServiceInstancesTransactionStatistics({ + ...paramsForSubQueries, + includeTimeseries: false, + }); + const serviceNodeIds = transactionStats.map((item) => item.serviceNodeName); + const systemMetricStats = await getServiceInstancesSystemMetricStatistics({ + ...paramsForSubQueries, + includeTimeseries: false, + serviceNodeIds, + }); - const stats = joinByKey( - [...transactionStats, ...systemMetricStats], - 'serviceNodeName' - ); + const systemMetricStatsMap = keyBy(systemMetricStats, 'serviceNodeName'); + const stats = transactionStats.length + ? transactionStats.map((item) => ({ + ...item, + ...(systemMetricStatsMap[item.serviceNodeName] || {}), + })) + : systemMetricStats; - return stats; + return orderBy(stats, sortField, sortDirection).slice(0, 100); }); } diff --git a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts index 84ec4da4829e8..a44a557e2b4de 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; +import { + kqlQuery, + rangeQuery, + wildcardQuery, +} from '@kbn/observability-plugin/server'; import { ApmTransactionDocumentType } from '../../../common/document_type'; import { SERVICE_NAME, @@ -43,7 +47,7 @@ export interface TransactionGroups { export interface ServiceTransactionGroupsResponse { transactionGroups: TransactionGroups[]; - maxTransactionGroupsExceeded: boolean; + maxCountExceeded: boolean; transactionOverflowCount: number; hasActiveAlerts: boolean; } @@ -60,6 +64,7 @@ export async function getServiceTransactionGroups({ documentType, rollupInterval, useDurationSummary, + searchQuery, }: { environment: string; kuery: string; @@ -72,6 +77,7 @@ export async function getServiceTransactionGroups({ documentType: ApmTransactionDocumentType; rollupInterval: RollupInterval; useDurationSummary: boolean; + searchQuery?: string; }): Promise { const field = getDurationFieldForTransactions( documentType, @@ -107,6 +113,7 @@ export async function getServiceTransactionGroups({ ...rangeQuery(start, end), ...environmentQuery(environment), ...kqlQuery(kuery), + ...wildcardQuery(TRANSACTION_NAME, searchQuery), ], }, }, @@ -169,7 +176,7 @@ export async function getServiceTransactionGroups({ ...transactionGroup, transactionType, })), - maxTransactionGroupsExceeded: + maxCountExceeded: (response.aggregations?.transaction_groups.sum_other_doc_count ?? 0) > 0, transactionOverflowCount: response.aggregations?.transaction_overflow_count.value ?? 0, diff --git a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts index 9ad556df126ba..178c5e186c316 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups_alerts.ts @@ -9,6 +9,7 @@ import { kqlQuery, termQuery, rangeQuery, + wildcardQuery, } from '@kbn/observability-plugin/server'; import { ALERT_RULE_PRODUCER, @@ -47,6 +48,7 @@ export async function getServiceTransactionGroupsAlerts({ start, end, environment, + searchQuery, }: { apmAlertsClient: ApmAlertsClient; kuery?: string; @@ -56,6 +58,7 @@ export async function getServiceTransactionGroupsAlerts({ start: number; end: number; environment?: string; + searchQuery?: string; }): Promise { const ALERT_RULE_PARAMETERS_AGGREGATION_TYPE = `${ALERT_RULE_PARAMETERS}.aggregationType`; @@ -72,6 +75,7 @@ export async function getServiceTransactionGroupsAlerts({ ...termQuery(SERVICE_NAME, serviceName), ...termQuery(TRANSACTION_TYPE, transactionType), ...environmentQuery(environment), + ...wildcardQuery(TRANSACTION_NAME, searchQuery), ], must: [ { diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts index 0b8a252da9a76..f2dbeb8410bbe 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_health_statuses.ts @@ -18,6 +18,7 @@ interface AggregationParams { mlClient?: MlClient; start: number; end: number; + searchQuery: string | undefined; } export type ServiceHealthStatusesResponse = Array<{ @@ -30,6 +31,7 @@ export async function getHealthStatuses({ mlClient, start, end, + searchQuery, }: AggregationParams): Promise { if (!mlClient) { return []; @@ -40,6 +42,7 @@ export async function getHealthStatuses({ environment, start, end, + searchQuery, }); return anomalies.serviceAnomalies.map((anomalyStats) => { diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts index e47d9b61124cc..0fc76f803c440 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_service_alerts.ts @@ -9,6 +9,7 @@ import { kqlQuery, termQuery, rangeQuery, + wildcardQuery, } from '@kbn/observability-plugin/server'; import { ALERT_RULE_PRODUCER, @@ -37,6 +38,7 @@ export async function getServicesAlerts({ start, end, environment, + searchQuery, }: { apmAlertsClient: ApmAlertsClient; kuery?: string; @@ -46,6 +48,7 @@ export async function getServicesAlerts({ start: number; end: number; environment?: string; + searchQuery?: string; }): Promise { const params = { size: 0, @@ -59,6 +62,7 @@ export async function getServicesAlerts({ ...kqlQuery(kuery), ...serviceGroupWithOverflowQuery(serviceGroup), ...termQuery(SERVICE_NAME, serviceName), + ...wildcardQuery(SERVICE_NAME, searchQuery), ...environmentQuery(environment), ], }, diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts index 7fbeb1cc9d24c..a79e17c32c04b 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; +import { + kqlQuery, + rangeQuery, + wildcardQuery, +} from '@kbn/observability-plugin/server'; import { ApmDocumentType } from '../../../../common/document_type'; import { AGENT_NAME, @@ -45,6 +49,7 @@ interface AggregationParams { | ApmDocumentType.TransactionEvent; rollupInterval: RollupInterval; useDurationSummary: boolean; + searchQuery: string | undefined; } export interface ServiceTransactionStatsResponse { @@ -72,6 +77,7 @@ export async function getServiceTransactionStats({ documentType, rollupInterval, useDurationSummary, + searchQuery, }: AggregationParams): Promise { const outcomes = getOutcomeAggregation(documentType); @@ -108,6 +114,7 @@ export async function getServiceTransactionStats({ ...environmentQuery(environment), ...kqlQuery(kuery), ...serviceGroupWithOverflowQuery(serviceGroup), + ...wildcardQuery(SERVICE_NAME, searchQuery), ], }, }, diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts index c36754e4cf50f..e57e8e9d20235 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_services_items.ts @@ -24,7 +24,7 @@ export const MAX_NUMBER_OF_SERVICES = 1_000; export interface ServicesItemsResponse { items: MergedServiceStat[]; - maxServiceCountExceeded: boolean; + maxCountExceeded: boolean; serviceOverflowCount: number; } @@ -42,6 +42,7 @@ export async function getServicesItems({ documentType, rollupInterval, useDurationSummary, + searchQuery, }: { environment: string; kuery: string; @@ -56,6 +57,7 @@ export async function getServicesItems({ documentType: ApmServiceTransactionDocumentType; rollupInterval: RollupInterval; useDurationSummary: boolean; + searchQuery?: string; }): Promise { return withApmSpan('get_services_items', async () => { const commonParams = { @@ -69,11 +71,12 @@ export async function getServicesItems({ documentType, rollupInterval, useDurationSummary, + searchQuery, }; const [ { serviceStats, serviceOverflowCount }, - { services: servicesWithoutTransactions, maxServiceCountExceeded }, + { services: servicesWithoutTransactions, maxCountExceeded }, healthStatuses, alertCounts, ] = await Promise.all([ @@ -103,7 +106,7 @@ export async function getServicesItems({ healthStatuses, alertCounts, }) ?? [], - maxServiceCountExceeded, + maxCountExceeded, serviceOverflowCount, }; }); diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts index 0eedb8494f21b..0ddae57603fe1 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_services_without_transactions.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; +import { + kqlQuery, + rangeQuery, + wildcardQuery, +} from '@kbn/observability-plugin/server'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; import { @@ -27,7 +31,7 @@ export interface ServicesWithoutTransactionsResponse { environments: string[]; agentName: AgentName; }>; - maxServiceCountExceeded: boolean; + maxCountExceeded: boolean; } export async function getServicesWithoutTransactions({ @@ -41,6 +45,7 @@ export async function getServicesWithoutTransactions({ randomSampler, documentType, rollupInterval, + searchQuery, }: { apmEventClient: APMEventClient; environment: string; @@ -52,6 +57,7 @@ export async function getServicesWithoutTransactions({ randomSampler: RandomSampler; documentType: ApmDocumentType; rollupInterval: RollupInterval; + searchQuery: string | undefined; }): Promise { const isServiceTransactionMetric = documentType === ApmDocumentType.ServiceTransactionMetric; @@ -83,6 +89,7 @@ export async function getServicesWithoutTransactions({ ...environmentQuery(environment), ...kqlQuery(kuery), ...serviceGroupWithOverflowQuery(serviceGroup), + ...wildcardQuery(SERVICE_NAME, searchQuery), ], }, }, @@ -116,6 +123,9 @@ export async function getServicesWithoutTransactions({ } ); + const maxCountExceeded = + (response.aggregations?.sample.services.sum_other_doc_count ?? 0) > 0; + return { services: response.aggregations?.sample.services.buckets.map((bucket) => { @@ -127,7 +137,6 @@ export async function getServicesWithoutTransactions({ agentName: bucket.latest.top[0].metrics[AGENT_NAME] as AgentName, }; }) ?? [], - maxServiceCountExceeded: - (response.aggregations?.sample.services.sum_other_doc_count ?? 0) > 0, + maxCountExceeded, }; } diff --git a/x-pack/plugins/apm/server/routes/services/route.ts b/x-pack/plugins/apm/server/routes/services/route.ts index 0a51a3e88379f..550cab6e76249 100644 --- a/x-pack/plugins/apm/server/routes/services/route.ts +++ b/x-pack/plugins/apm/server/routes/services/route.ts @@ -24,6 +24,7 @@ import { mergeWith, uniq } from 'lodash'; import { ML_ERRORS } from '../../../common/anomaly_detection'; import { ServiceAnomalyTimeseries } from '../../../common/anomaly_detection/service_anomaly_timeseries'; import { offsetRt } from '../../../common/comparison_rt'; +import { instancesSortFieldRt } from '../../../common/instances'; import { latencyAggregationTypeRt } from '../../../common/latency_aggregation_types'; import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; import { getAnomalyTimeseries } from '../../lib/anomaly_detection/get_anomaly_timeseries'; @@ -107,7 +108,10 @@ const servicesRoute = createApmServerRoute({ endpoint: 'GET /internal/apm/services', params: t.type({ query: t.intersection([ - t.partial({ serviceGroup: t.string }), + t.partial({ + searchQuery: t.string, + serviceGroup: t.string, + }), t.intersection([ probabilityRt, t.intersection([ @@ -133,6 +137,7 @@ const servicesRoute = createApmServerRoute({ } = resources; const { + searchQuery, environment, kuery, start, @@ -175,6 +180,7 @@ const servicesRoute = createApmServerRoute({ documentType, rollupInterval, useDurationSummary, + searchQuery, }); }, }); @@ -613,6 +619,8 @@ const serviceInstancesMainStatisticsRoute = createApmServerRoute({ t.type({ latencyAggregationType: latencyAggregationTypeRt, transactionType: t.string, + sortField: instancesSortFieldRt, + sortDirection: t.union([t.literal('asc'), t.literal('desc')]), }), offsetRt, environmentRt, @@ -638,6 +646,8 @@ const serviceInstancesMainStatisticsRoute = createApmServerRoute({ offset, start, end, + sortField, + sortDirection, } = params.query; const searchAggregatedTransactions = await getSearchTransactionsEvents({ @@ -648,33 +658,24 @@ const serviceInstancesMainStatisticsRoute = createApmServerRoute({ end, }); + const commonParams = { + environment, + kuery, + latencyAggregationType, + serviceName, + apmEventClient, + transactionType, + searchAggregatedTransactions, + start, + end, + sortField, + sortDirection, + }; + const [currentPeriod, previousPeriod] = await Promise.all([ - getServiceInstancesMainStatistics({ - environment, - kuery, - latencyAggregationType, - serviceName, - apmEventClient, - transactionType, - searchAggregatedTransactions, - start, - end, - }), + getServiceInstancesMainStatistics(commonParams), ...(offset - ? [ - getServiceInstancesMainStatistics({ - environment, - kuery, - latencyAggregationType, - serviceName, - apmEventClient, - transactionType, - searchAggregatedTransactions, - start, - end, - offset, - }), - ] + ? [getServiceInstancesMainStatistics({ ...commonParams, offset })] : []), ]); diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts b/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts index 62082b2236dec..55cdaebf26791 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts +++ b/x-pack/plugins/apm/server/routes/settings/custom_link/helper.ts @@ -40,8 +40,8 @@ export function toESFormat(customLink: CustomLink): CustomLinkES { return { label, url, ...ESFilters }; } -export function splitFilterValueByComma(filterValue: Filter['value']) { - return filterValue +export function splitFilterValueByComma(searchQuery: Filter['value']) { + return searchQuery .split(',') .map((v) => v.trim()) .filter((v) => v); diff --git a/x-pack/plugins/apm/server/routes/transactions/route.ts b/x-pack/plugins/apm/server/routes/transactions/route.ts index 888cb82820cc1..0796062227b08 100644 --- a/x-pack/plugins/apm/server/routes/transactions/route.ts +++ b/x-pack/plugins/apm/server/routes/transactions/route.ts @@ -73,10 +73,11 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ params: t.type({ path: t.type({ serviceName: t.string }), query: t.intersection([ + t.partial({ searchQuery: t.string }), environmentRt, - kueryRt, rangeRt, t.type({ + kuery: t.string, useDurationSummary: toBooleanRt, transactionType: t.string, latencyAggregationType: latencyAggregationTypeRt, @@ -106,6 +107,7 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ documentType, rollupInterval, useDurationSummary, + searchQuery, }, } = params; @@ -117,6 +119,7 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ latencyAggregationType, start, end, + searchQuery, }; const [serviceTransactionGroups, serviceTransactionGroupsAlerts] = @@ -134,11 +137,8 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ }), ]); - const { - transactionGroups, - maxTransactionGroupsExceeded, - transactionOverflowCount, - } = serviceTransactionGroups; + const { transactionGroups, maxCountExceeded, transactionOverflowCount } = + serviceTransactionGroups; const transactionGroupsWithAlerts = joinByKey( [...transactionGroups, ...serviceTransactionGroupsAlerts], @@ -147,7 +147,7 @@ const transactionGroupsMainStatisticsRoute = createApmServerRoute({ return { transactionGroups: transactionGroupsWithAlerts, - maxTransactionGroupsExceeded, + maxCountExceeded, transactionOverflowCount, hasActiveAlerts: !!serviceTransactionGroupsAlerts.length, }; diff --git a/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx b/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx index c6278187d960c..27f94319ecbcf 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns_popover.test.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; import type { AppMockRenderer } from '../../common/mock'; import { createAppMockRenderer } from '../../common/mock'; @@ -34,6 +35,8 @@ describe('ColumnsPopover', () => { userEvent.click(await screen.findByTestId('column-selection-popover-button')); + await waitForEuiPopoverOpen(); + expect(await screen.findByTestId('column-selection-popover')).toBeInTheDocument(); selectedColumns.forEach(({ field, name, isChecked }) => { @@ -132,6 +135,7 @@ describe('ColumnsPopover', () => { ); userEvent.click(await screen.findByTestId('column-selection-popover-button')); + await waitForEuiPopoverOpen(); userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Title'); expect(await screen.findByTestId('column-selection-switch-title')).toBeInTheDocument(); @@ -150,9 +154,12 @@ describe('ColumnsPopover', () => { ); userEvent.click(await screen.findByTestId('column-selection-popover-button')); + await waitForEuiPopoverOpen(); userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Category'); - expect(onSelectedColumnsChange).not.toHaveBeenCalled(); + await waitFor(() => { + expect(onSelectedColumnsChange).not.toHaveBeenCalled(); + }); }); it('searching for text hides the drag and drop icons', async () => { @@ -177,6 +184,9 @@ describe('ColumnsPopover', () => { ); userEvent.click(await screen.findByTestId('column-selection-popover-button')); + + await waitForEuiPopoverOpen(); + userEvent.paste(await screen.findByTestId('column-selection-popover-search'), 'Foobar'); expect(await screen.findByTestId('column-selection-popover-show-all-button')).toBeDisabled(); diff --git a/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx b/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx index cd9515edbd28c..94ce019498078 100644 --- a/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx @@ -18,7 +18,8 @@ import type { FormProps } from './schema'; import { schema } from './schema'; import { waitForComponentToPaint } from '../../common/test_utils'; -describe('Case Owner Selection', () => { +// FLAKY: https://github.com/elastic/kibana/issues/175570 +describe.skip('Case Owner Selection', () => { let globalForm: FormHook; const MockHookWrapperComponent: React.FC = ({ children }) => { diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/utils.test.ts b/x-pack/plugins/cases/public/components/visualizations/actions/utils.test.ts index ca400b611fb4f..591e12dd7a712 100644 --- a/x-pack/plugins/cases/public/components/visualizations/actions/utils.test.ts +++ b/x-pack/plugins/cases/public/components/visualizations/actions/utils.test.ts @@ -59,6 +59,7 @@ describe('utils', () => { Object { "persistableStateAttachmentState": Object { "attributes": Object {}, + "metadata": undefined, "timeRange": Object {}, }, "persistableStateAttachmentTypeId": ".lens", diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/utils.ts b/x-pack/plugins/cases/public/components/visualizations/actions/utils.ts index 77bf41a78a791..aaabd73dfc884 100644 --- a/x-pack/plugins/cases/public/components/visualizations/actions/utils.ts +++ b/x-pack/plugins/cases/public/components/visualizations/actions/utils.ts @@ -5,11 +5,12 @@ * 2.0. */ import type { IEmbeddable } from '@kbn/embeddable-plugin/public'; -import type { LensEmbeddableInput, LensSavedObjectAttributes } from '@kbn/lens-plugin/public'; +import type { LensSavedObjectAttributes } from '@kbn/lens-plugin/public'; import { LENS_EMBEDDABLE_TYPE, type Embeddable as LensEmbeddable } from '@kbn/lens-plugin/public'; import { LENS_ATTACHMENT_TYPE } from '../../../../common/constants/visualizations'; import type { PersistableStateAttachmentPayload } from '../../../../common/types/domain'; import { AttachmentType } from '../../../../common/types/domain'; +import type { LensProps } from '../types'; export const isLensEmbeddable = (embeddable: IEmbeddable): embeddable is LensEmbeddable => { return embeddable.type === LENS_EMBEDDABLE_TYPE; @@ -26,12 +27,14 @@ type PersistableStateAttachmentWithoutOwner = Omit ({ - persistableStateAttachmentState: { attributes, timeRange }, + persistableStateAttachmentState: { attributes, timeRange, metadata }, persistableStateAttachmentTypeId: LENS_ATTACHMENT_TYPE, type: AttachmentType.persistableState, } as unknown as PersistableStateAttachmentWithoutOwner); diff --git a/x-pack/plugins/cases/public/components/visualizations/attachment.tsx b/x-pack/plugins/cases/public/components/visualizations/attachment.tsx index 70fbdd8e35bd9..013187afc5481 100644 --- a/x-pack/plugins/cases/public/components/visualizations/attachment.tsx +++ b/x-pack/plugins/cases/public/components/visualizations/attachment.tsx @@ -26,6 +26,7 @@ function getOpenLensButton(attachmentId: string, props: LensProps) { attachmentId={attachmentId} attributes={props.attributes} timeRange={props.timeRange} + metadata={props.metadata} /> ); } @@ -40,9 +41,10 @@ const getVisualizationAttachmentActions = (attachmentId: string, props: LensProp const LensAttachment = React.memo( (props: PersistableStateAttachmentViewProps) => { - const { attributes, timeRange } = props.persistableStateAttachmentState as unknown as LensProps; + const { attributes, timeRange, metadata } = + props.persistableStateAttachmentState as unknown as LensProps; - return ; + return ; }, (prevProps, nextProps) => deepEqual(prevProps.persistableStateAttachmentState, nextProps.persistableStateAttachmentState) diff --git a/x-pack/plugins/cases/public/components/visualizations/lens_renderer.test.tsx b/x-pack/plugins/cases/public/components/visualizations/lens_renderer.test.tsx index 3fcc23adbc21a..c40aa48075129 100644 --- a/x-pack/plugins/cases/public/components/visualizations/lens_renderer.test.tsx +++ b/x-pack/plugins/cases/public/components/visualizations/lens_renderer.test.tsx @@ -62,4 +62,13 @@ describe('LensRenderer', () => { expect(screen.queryByTestId('embeddableComponent')).not.toBeInTheDocument(); }); + + it('renders the lens visualization with description', () => { + appMockRender.render( + // @ts-expect-error: props are correct + + ); + + expect(screen.getByText('description')).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/cases/public/components/visualizations/lens_renderer.tsx b/x-pack/plugins/cases/public/components/visualizations/lens_renderer.tsx index 3ab0b272cd6ac..ad1bb55c1c953 100644 --- a/x-pack/plugins/cases/public/components/visualizations/lens_renderer.tsx +++ b/x-pack/plugins/cases/public/components/visualizations/lens_renderer.tsx @@ -9,6 +9,7 @@ import React from 'react'; import styled from 'styled-components'; import { createGlobalStyle } from '@kbn/kibana-react-plugin/common'; +import { EuiSpacer } from '@elastic/eui'; import { useKibana } from '../../common/lib/kibana'; import type { LensProps } from './types'; @@ -25,7 +26,7 @@ const LensChartTooltipFix = createGlobalStyle` } `; -const LensRendererComponent: React.FC = ({ attributes, timeRange }) => { +const LensRendererComponent: React.FC = ({ attributes, timeRange, metadata }) => { const { lens: { EmbeddableComponent }, } = useKibana().services; @@ -35,22 +36,30 @@ const LensRendererComponent: React.FC = ({ attributes, timeRange }) = } return ( - - - - + <> + {metadata && metadata.description && ( + <> + {metadata.description} + + + )} + + + + + ); }; diff --git a/x-pack/plugins/cases/public/components/visualizations/types.ts b/x-pack/plugins/cases/public/components/visualizations/types.ts index b4f2d33d3d482..89b60e9753391 100644 --- a/x-pack/plugins/cases/public/components/visualizations/types.ts +++ b/x-pack/plugins/cases/public/components/visualizations/types.ts @@ -7,4 +7,11 @@ import type { TypedLensByValueInput } from '@kbn/lens-plugin/public'; -export type LensProps = Pick; +export type LensProps = Pick & { + /** + * Optional metadata used to customize the Lens Attachment rendering. + */ + metadata?: { + description?: string; + }; +}; diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index ee00fc034c1d6..621a135b1ae3c 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -172,5 +172,6 @@ export type SupportedCaseAttachment = export type CaseAttachments = SupportedCaseAttachment[]; export type CaseAttachmentWithoutOwner = DistributiveOmit; export type CaseAttachmentsWithoutOwner = CaseAttachmentWithoutOwner[]; +export type { LensProps } from './components/visualizations/types'; export type ServerError = IHttpFetchError; diff --git a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx b/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx index b2a79710d09a2..f0d5d64edab67 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx @@ -16,7 +16,7 @@ import { useFetchDetectionRulesAlertsStatus } from '../common/api/use_fetch_dete import { useFetchDetectionRulesByTags } from '../common/api/use_fetch_detection_rules_by_tags'; import { RuleResponse } from '../common/types'; import { useKibana } from '../common/hooks/use_kibana'; -import { showSuccessToast } from './take_action'; +import { showCreateDetectionRuleSuccessToast } from './take_action'; import { DETECTION_ENGINE_ALERTS_KEY, DETECTION_ENGINE_RULES_KEY } from '../common/constants'; const RULES_PAGE_PATH = '/rules/management'; @@ -61,7 +61,7 @@ export const DetectionRuleCounter = ({ tags, createRuleFn }: DetectionRuleCounte setIsCreateRuleLoading(true); const ruleResponse = await createRuleFn(http); setIsCreateRuleLoading(false); - showSuccessToast(notifications, http, ruleResponse); + showCreateDetectionRuleSuccessToast(notifications, http, ruleResponse); // Triggering a refetch of rules and alerts to update the UI queryClient.invalidateQueries([DETECTION_ENGINE_RULES_KEY]); queryClient.invalidateQueries([DETECTION_ENGINE_ALERTS_KEY]); diff --git a/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx b/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx index f72a4f7114be3..caf7f34651997 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx @@ -19,7 +19,7 @@ import { import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import type { HttpSetup, NotificationsStart } from '@kbn/core/public'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useQueryClient } from '@tanstack/react-query'; +import { QueryClient, useQueryClient } from '@tanstack/react-query'; import type { RuleResponse } from '../common/types'; import { CREATE_RULE_ACTION_SUBJ, TAKE_ACTION_SUBJ } from './test_subjects'; import { useKibana } from '../common/hooks/use_kibana'; @@ -28,10 +28,12 @@ import { DETECTION_ENGINE_ALERTS_KEY, DETECTION_ENGINE_RULES_KEY } from '../comm const RULE_PAGE_PATH = '/app/security/rules/id/'; interface TakeActionProps { - createRuleFn: (http: HttpSetup) => Promise; + createRuleFn?: (http: HttpSetup) => Promise; + enableBenchmarkRuleFn?: () => Promise; + disableBenchmarkRuleFn?: () => Promise; } -export const showSuccessToast = ( +export const showCreateDetectionRuleSuccessToast = ( notifications: NotificationsStart, http: HttpSetup, ruleResponse: RuleResponse @@ -76,11 +78,64 @@ export const showSuccessToast = ( }); }; +export const showChangeBenchmarkRuleStatesSuccessToast = ( + notifications: NotificationsStart, + isBenchmarkRuleMuted: boolean +) => { + return notifications.toasts.addSuccess({ + toastLifeTimeMs: 10000, + color: 'success', + iconType: '', + 'data-test-subj': 'csp:toast-success-rule-state-change', + text: toMountPoint( +
+ + {isBenchmarkRuleMuted ? ( + <> + + + + + + + + ) : ( + <> + + + + + + + + )} + +
+ ), + }); +}; + /* * This component is used to create a detection rule from Flyout. * It accepts a createRuleFn parameter which is used to create a rule in a generic way. */ -export const TakeAction = ({ createRuleFn }: TakeActionProps) => { +export const TakeAction = ({ + createRuleFn, + enableBenchmarkRuleFn, + disableBenchmarkRuleFn, +}: TakeActionProps) => { const queryClient = useQueryClient(); const [isPopoverOpen, setPopoverOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); @@ -105,6 +160,44 @@ export const TakeAction = ({ createRuleFn }: TakeActionProps) => {
); + const actionsItems = []; + + if (createRuleFn) + actionsItems.push( + + ); + if (enableBenchmarkRuleFn) + actionsItems.push( + + ); + if (disableBenchmarkRuleFn) + actionsItems.push( + + ); return ( { anchorPosition="downLeft" data-test-subj={TAKE_ACTION_SUBJ} > - { - closePopover(); - setIsLoading(true); - const ruleResponse = await createRuleFn(http); - setIsLoading(false); - showSuccessToast(notifications, http, ruleResponse); - // Triggering a refetch of rules and alerts to update the UI - queryClient.invalidateQueries([DETECTION_ENGINE_RULES_KEY]); - queryClient.invalidateQueries([DETECTION_ENGINE_ALERTS_KEY]); - }} - data-test-subj={CREATE_RULE_ACTION_SUBJ} - > - - , - ]} - /> + ); }; + +const CreateDetectionRule = ({ + createRuleFn, + setIsLoading, + closePopover, + notifications, + http, + queryClient, +}: { + createRuleFn: (http: HttpSetup) => Promise; + setIsLoading: (isLoading: boolean) => void; + closePopover: () => void; + notifications: NotificationsStart; + http: HttpSetup; + queryClient: QueryClient; +}) => { + return ( + { + closePopover(); + setIsLoading(true); + const ruleResponse = await createRuleFn(http); + setIsLoading(false); + showCreateDetectionRuleSuccessToast(notifications, http, ruleResponse); + // Triggering a refetch of rules and alerts to update the UI + queryClient.invalidateQueries([DETECTION_ENGINE_RULES_KEY]); + queryClient.invalidateQueries([DETECTION_ENGINE_ALERTS_KEY]); + }} + data-test-subj={CREATE_RULE_ACTION_SUBJ} + > + + + ); +}; + +const EnableBenchmarkRule = ({ + enableBenchmarkRuleFn, + setIsLoading, + closePopover, + notifications, +}: { + enableBenchmarkRuleFn: () => Promise; + setIsLoading: (isLoading: boolean) => void; + closePopover: () => void; + notifications: NotificationsStart; + http: HttpSetup; + queryClient: QueryClient; +}) => { + return ( + { + closePopover(); + setIsLoading(true); + await enableBenchmarkRuleFn(); + setIsLoading(false); + }} + data-test-subj={'enable-benchmark-rule-take-action-button'} + > + + + ); +}; + +const DisableBenchmarkRule = ({ + disableBenchmarkRuleFn, + setIsLoading, + closePopover, + notifications, +}: { + disableBenchmarkRuleFn: () => Promise; + setIsLoading: (isLoading: boolean) => void; + closePopover: () => void; + notifications: NotificationsStart; + http: HttpSetup; + queryClient: QueryClient; +}) => { + return ( + { + closePopover(); + setIsLoading(true); + await disableBenchmarkRuleFn(); + setIsLoading(false); + }} + data-test-subj={'disable-benchmark-rule-take-action-button'} + > + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx index dfc8dac21ea15..421c53726371f 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.test.tsx @@ -85,6 +85,8 @@ const params = { ruleNumber: undefined, search: '', section: undefined, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }, benchmarkId: 'cis_k8s', benchmarkVersion: '1.0.1', diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx index e0017fa7a54e1..7fb1fb3a58f55 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx @@ -77,6 +77,8 @@ export const RulesContainer = () => { search: '', page: 0, perPage: pageSize || 10, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }); const { data, status, error } = useFindCspBenchmarkRule( @@ -86,6 +88,8 @@ export const RulesContainer = () => { search: rulesQuery.search, page: 1, perPage: MAX_ITEMS_PER_PAGE, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }, params.benchmarkId, params.benchmarkVersion @@ -96,6 +100,8 @@ export const RulesContainer = () => { { page: 1, perPage: MAX_ITEMS_PER_PAGE, + sortField: 'metadata.benchmark.rule_number', + sortOrder: 'asc', }, params.benchmarkId, params.benchmarkVersion diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx index 228785e0cb61d..dbfcb6df75a98 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx @@ -6,7 +6,6 @@ */ import React, { useState } from 'react'; import { - EuiSpacer, EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, @@ -17,9 +16,9 @@ import { EuiFlexItem, EuiFlexGroup, EuiSwitch, + EuiFlyoutFooter, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; import { CspBenchmarkRuleMetadata } from '../../../common/types/latest'; import { getRuleList } from '../configurations/findings_flyout/rule_tab'; @@ -27,6 +26,9 @@ import { getRemediationList } from '../configurations/findings_flyout/overview_t import * as TEST_SUBJECTS from './test_subjects'; import { useChangeCspRuleState } from './change_csp_rule_state'; import { CspBenchmarkRulesWithStates } from './rules_container'; +import { TakeAction } from '../../components/take_action'; + +export const RULES_FLYOUT_SWITCH_BUTTON = 'rule-flyout-switch-button'; interface RuleFlyoutProps { onClose(): void; @@ -82,27 +84,6 @@ export const RuleFlyout = ({ onClose, rule, refetchRulesStates }: RuleFlyoutProp

{rule.metadata.name}

- - - ) : ( - - ) - } - /> - {tabs.map((item) => ( - {tab === 'overview' && } + {tab === 'overview' && ( + + )} {tab === 'remediation' && ( )} + + + + {isRuleMuted ? ( + + ) : ( + + )} + + + ); }; -const RuleOverviewTab = ({ rule }: { rule: CspBenchmarkRuleMetadata }) => ( +const RuleOverviewTab = ({ + rule, + ruleData, + switchRuleStates, +}: { + rule: CspBenchmarkRuleMetadata; + ruleData: CspBenchmarkRulesWithStates; + switchRuleStates: () => Promise; +}) => ( - + ); + +const ruleState = (rule: CspBenchmarkRulesWithStates, switchRuleStates: () => Promise) => [ + { + title: i18n.translate('xpack.csp.rules.rulesFlyout.ruleState', { + defaultMessage: 'Enabled', + }), + description: ( + <> + + + ), + }, +]; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts index d1a677e4e5182..d580a7719ed0a 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_benchmark_rules.ts @@ -18,12 +18,12 @@ import { export type RulesQuery = Pick< FindCspBenchmarkRuleRequest, - 'section' | 'search' | 'page' | 'perPage' | 'ruleNumber' + 'section' | 'search' | 'page' | 'perPage' | 'ruleNumber' | 'sortField' | 'sortOrder' >; export type RulesQueryResult = ReturnType; export const useFindCspBenchmarkRule = ( - { search, page, perPage, section, ruleNumber }: RulesQuery, + { search, page, perPage, section, ruleNumber, sortField, sortOrder }: RulesQuery, benchmarkId: string, benchmarkVersion?: string ) => { @@ -32,11 +32,31 @@ export const useFindCspBenchmarkRule = ( return useQuery( [ CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, - { section, search, page, perPage, benchmarkId, benchmarkVersion, ruleNumber }, + { + section, + search, + page, + perPage, + benchmarkId, + benchmarkVersion, + ruleNumber, + sortField, + sortOrder, + }, ], () => { return http.get(FIND_CSP_BENCHMARK_RULE_ROUTE_PATH, { - query: { benchmarkId, page, perPage, search, section, benchmarkVersion, ruleNumber }, + query: { + benchmarkId, + page, + perPage, + search, + section, + benchmarkVersion, + ruleNumber, + sortField, + sortOrder, + }, version: '3', }); } diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts index 0601a4eb25577..2f57dc40ca5f9 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/utils.ts @@ -24,7 +24,10 @@ export const getSortedCspBenchmarkRulesTemplates = (cspBenchmarkRules: CspBenchm if (versionA !== null && versionB !== null) { return semverCompare(versionA, versionB); } else { - return String(ruleNumberA).localeCompare(String(ruleNumberB)); + return String(ruleNumberA).localeCompare(String(ruleNumberB), undefined, { + numeric: true, + sensitivity: 'base', + }); } }); }; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts index 6cf4efd5705a0..dff6cd3add966 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/find/v3.ts @@ -50,7 +50,10 @@ export const findBenchmarkRuleHandler = async ( const sortedCspBenchmarkRules = getSortedCspBenchmarkRulesTemplates(cspBenchmarkRules); return { - items: sortedCspBenchmarkRules, + items: + options.sortField === 'metadata.benchmark.rule_number' + ? sortedCspBenchmarkRules + : cspBenchmarkRules, total: cspCspBenchmarkRulesSo.total, page: options.page, perPage: options.perPage, diff --git a/x-pack/plugins/enterprise_search/common/types/connectors.ts b/x-pack/plugins/enterprise_search/common/types/connectors.ts new file mode 100644 index 0000000000000..9af170e4dbdcd --- /dev/null +++ b/x-pack/plugins/enterprise_search/common/types/connectors.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface DeleteConnectorResponse { + acknowledge: boolean; +} diff --git a/x-pack/plugins/enterprise_search/kibana.jsonc b/x-pack/plugins/enterprise_search/kibana.jsonc index b43c22b8cb57c..ff58e36304577 100644 --- a/x-pack/plugins/enterprise_search/kibana.jsonc +++ b/x-pack/plugins/enterprise_search/kibana.jsonc @@ -22,7 +22,8 @@ "esUiShared", "lens", "embeddable", - "share" + "share", + "console" ], "optionalPlugins": [ "customIntegrations", diff --git a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts index 4388276117fc7..bc397d3c1fcd6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts @@ -33,6 +33,7 @@ export const mockKibanaValues = { isCloudEnabled: false, }, config: { host: 'http://localhost:3002' }, + consolePlugin: {}, data: dataPluginMock.createStartContract(), esConfig: { elasticsearch_host: 'https://your_deployment_url' }, guidedOnboarding: {}, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx index 213730ed31ace..27d4067e59750 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/layout/page_template.tsx @@ -26,6 +26,7 @@ export const AppSearchPageTemplate: React.FC< }} setPageChrome={pageChrome && } useEndpointHeaderActions={false} + hideEmbeddedConsole > {pageViewTelemetry && } {children} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/delete_connector_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/delete_connector_api_logic.ts new file mode 100644 index 0000000000000..a427b634c3b6e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/delete_connector_api_logic.ts @@ -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 { DeleteConnectorResponse } from '../../../../../common/types/connectors'; + +import { Actions, createApiLogic } from '../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../shared/http'; + +export interface DeleteConnectorApiLogicArgs { + connectorId: string; + shouldDeleteIndex: boolean; +} + +export interface DeleteConnectorApiLogicResponse { + acknowledged: boolean; +} + +export const deleteConnector = async ({ + connectorId, + shouldDeleteIndex = false, +}: DeleteConnectorApiLogicArgs) => { + return await HttpLogic.values.http.delete( + `/internal/enterprise_search/connectors/${connectorId}`, + { + query: { + shouldDeleteIndex, + }, + } + ); +}; + +export const DeleteConnectorApiLogic = createApiLogic( + ['delete_connector_api_logic'], + deleteConnector +); + +export type DeleteConnectorApiLogicActions = Actions< + DeleteConnectorApiLogicArgs, + DeleteConnectorResponse +>; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx index 0d797329093c8..3519fc9e16086 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors.tsx @@ -42,6 +42,7 @@ import { ConnectorStats } from './connector_stats'; import { ConnectorsLogic } from './connectors_logic'; import { ConnectorsTable } from './connectors_table'; import { CrawlerEmptyState } from './crawler_empty_state'; +import { DeleteConnectorModal } from './delete_connector_modal'; export const baseBreadcrumbs = [ i18n.translate('xpack.enterpriseSearch.content.connectors.breadcrumb', { @@ -53,7 +54,8 @@ export interface ConnectorsProps { isCrawler: boolean; } export const Connectors: React.FC = ({ isCrawler }) => { - const { fetchConnectors, onPaginate, setIsFirstRequest } = useActions(ConnectorsLogic); + const { fetchConnectors, onPaginate, setIsFirstRequest, openDeleteModal } = + useActions(ConnectorsLogic); const { data, isLoading, searchParams, isEmpty, connectors } = useValues(ConnectorsLogic); const { errorConnectingMessage } = useValues(HttpLogic); const [searchQuery, setSearchValue] = useState(''); @@ -69,151 +71,158 @@ export const Connectors: React.FC = ({ isCrawler }) => { return !isLoading && isEmpty && !isCrawler ? ( ) : ( - { - KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_PATH); - }} - > - -
, - { - KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_NATIVE_PATH); - }} - > - {i18n.translate('xpack.enterpriseSearch.connectors.newNativeConnectorButtonLabel', { - defaultMessage: 'New Native Connector', - })} - , - { - KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_CLIENTS_PATH); - }} - > - {i18n.translate( - 'xpack.enterpriseSearch.connectors.newConnectorsClientButtonLabel', - { defaultMessage: 'New Connector Client' } - )} - , - ] - : [ - { - KibanaLogic.values.navigateToUrl( - generateEncodedPath(NEW_INDEX_METHOD_PATH, { - type: INGESTION_METHOD_IDS.CRAWLER, - }) - ); - }} - > - {i18n.translate('xpack.enterpriseSearch.connectors.newCrawlerButtonLabel', { - defaultMessage: 'New web crawler', - })} - , - ], - }} - > - {Boolean(errorConnectingMessage) && ( - <> - - - - )} - - - - - {isEmpty && isCrawler ? ( - - ) : ( - <> - - -

- {!isCrawler ? ( - - ) : ( - + <> + + { + KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_PATH); + }} + > + + , + { + KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_NATIVE_PATH); + }} + > + {i18n.translate( + 'xpack.enterpriseSearch.connectors.newNativeConnectorButtonLabel', + { + defaultMessage: 'New Native Connector', + } )} -

-
-
- - setSearchValue(event.queryText)} - /> - - + , + { + KibanaLogic.values.navigateToUrl(NEW_INDEX_SELECT_CONNECTOR_CLIENTS_PATH); + }} + > + {i18n.translate( + 'xpack.enterpriseSearch.connectors.newConnectorsClientButtonLabel', + { defaultMessage: 'New Connector Client' } + )} + , + ] + : [ + { + KibanaLogic.values.navigateToUrl( + generateEncodedPath(NEW_INDEX_METHOD_PATH, { + type: INGESTION_METHOD_IDS.CRAWLER, + }) + ); + }} + > + {i18n.translate('xpack.enterpriseSearch.connectors.newCrawlerButtonLabel', { + defaultMessage: 'New web crawler', + })} + , + ], + }} + > + {Boolean(errorConnectingMessage) && ( + <> + + )} -
- + + + + + {isEmpty && isCrawler ? ( + + ) : ( + <> + + +

+ {!isCrawler ? ( + + ) : ( + + )} +

+
+
+ + setSearchValue(event.queryText)} + /> + + + + )} +
+ + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts index d4b6925ddade3..332b20d84928e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_logic.ts @@ -12,6 +12,10 @@ import { Connector } from '@kbn/search-connectors/types'; import { Status } from '../../../../../common/types/api'; import { Meta } from '../../../../../common/types/pagination'; +import { + DeleteConnectorApiLogic, + DeleteConnectorApiLogicActions, +} from '../../api/connector/delete_connector_api_logic'; import { FetchConnectorsApiLogic, FetchConnectorsApiLogicActions, @@ -21,6 +25,10 @@ export type ConnectorViewItem = Connector & { docsCount?: number }; export interface ConnectorsActions { apiError: FetchConnectorsApiLogicActions['apiError']; apiSuccess: FetchConnectorsApiLogicActions['apiSuccess']; + closeDeleteModal(): void; + deleteConnector: DeleteConnectorApiLogicActions['makeRequest']; + deleteError: DeleteConnectorApiLogicActions['apiError']; + deleteSuccess: DeleteConnectorApiLogicActions['apiSuccess']; fetchConnectors({ fetchCrawlersOnly, from, @@ -39,11 +47,26 @@ export interface ConnectorsActions { }; makeRequest: FetchConnectorsApiLogicActions['makeRequest']; onPaginate(newPageIndex: number): { newPageIndex: number }; + openDeleteModal( + connectorName: string, + connectorId: string, + indexName: string | null + ): { + connectorId: string; + connectorName: string; + indexName: string | null; + }; setIsFirstRequest(): void; } export interface ConnectorsValues { connectors: ConnectorViewItem[]; data: typeof FetchConnectorsApiLogic.values.data; + deleteModalConnectorId: string; + deleteModalConnectorName: string; + deleteModalIndexName: string | null; + deleteStatus: typeof DeleteConnectorApiLogic.values.status; + isDeleteLoading: boolean; + isDeleteModalVisible: boolean; isEmpty: boolean; isFetchConnectorsDetailsLoading: boolean; isFirstRequest: boolean; @@ -60,6 +83,7 @@ export interface ConnectorsValues { export const ConnectorsLogic = kea>({ actions: { + closeDeleteModal: true, fetchConnectors: ({ fetchCrawlersOnly, from, size, searchQuery }) => ({ fetchCrawlersOnly, from, @@ -67,13 +91,32 @@ export const ConnectorsLogic = kea ({ newPageIndex }), + openDeleteModal: (connectorName, connectorId, indexName) => ({ + connectorId, + connectorName, + indexName, + }), setIsFirstRequest: true, }, connect: { - actions: [FetchConnectorsApiLogic, ['makeRequest', 'apiSuccess', 'apiError']], - values: [FetchConnectorsApiLogic, ['data', 'status']], + actions: [ + DeleteConnectorApiLogic, + ['apiError as deleteError', 'apiSuccess as deleteSuccess', 'makeRequest as deleteConnector'], + FetchConnectorsApiLogic, + ['makeRequest', 'apiSuccess', 'apiError'], + ], + values: [ + DeleteConnectorApiLogic, + ['status as deleteStatus'], + FetchConnectorsApiLogic, + ['data', 'status'], + ], }, - listeners: ({ actions }) => ({ + listeners: ({ actions, values }) => ({ + deleteSuccess: () => { + actions.closeDeleteModal(); + actions.makeRequest(values.searchParams); + }, fetchConnectors: async (input, breakpoint) => { await breakpoint(150); actions.makeRequest(input); @@ -81,6 +124,34 @@ export const ConnectorsLogic = kea ({ + deleteModalConnectorId: [ + '', + { + closeDeleteModal: () => '', + openDeleteModal: (_, { connectorId }) => connectorId, + }, + ], + deleteModalConnectorName: [ + '', + { + closeDeleteModal: () => '', + openDeleteModal: (_, { connectorName }) => connectorName, + }, + ], + deleteModalIndexName: [ + null, + { + closeDeleteModal: () => null, + openDeleteModal: (_, { indexName }) => indexName, + }, + ], + isDeleteModalVisible: [ + false, + { + closeDeleteModal: () => false, + openDeleteModal: () => true, + }, + ], isFirstRequest: [ true, { @@ -128,6 +199,10 @@ export const ConnectorsLogic = kea [selectors.deleteStatus], + (deleteStatus) => Status.LOADING === deleteStatus, + ], isEmpty: [ () => [selectors.data], (data) => diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx index 3f58137b5dbd9..2c675c362b00e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/connectors_table.tsx @@ -41,6 +41,7 @@ interface ConnectorsTableProps { items: ConnectorViewItem[]; meta?: Meta; onChange: (criteria: CriteriaWithPagination) => void; + onDelete: (connectorName: string, connectorId: string, indexName: string | null) => void; } export const ConnectorsTable: React.FC = ({ items, @@ -53,6 +54,7 @@ export const ConnectorsTable: React.FC = ({ }, onChange, isLoading, + onDelete, }) => { const { navigateToUrl } = useValues(KibanaLogic); const columns: Array> = [ @@ -122,6 +124,23 @@ export const ConnectorsTable: React.FC = ({ }, { actions: [ + { + description: 'Delete this connector', + icon: 'trash', + isPrimary: false, + name: (connector) => + i18n.translate( + 'xpack.enterpriseSearch.content.connectors.connectorTable.column.actions.deleteIndex', + { + defaultMessage: 'Delete connector {connectorName}', + values: { connectorName: connector.name }, + } + ), + onClick: (connector) => { + onDelete(connector.name, connector.id, connector.index_name); + }, + type: 'icon', + }, { description: i18n.translate( 'xpack.enterpriseSearch.content.connectors.connectorTable.columns.actions.viewIndex', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/delete_connector_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/delete_connector_modal.tsx new file mode 100644 index 0000000000000..1a4236f59a798 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/delete_connector_modal.tsx @@ -0,0 +1,158 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useEffect } from 'react'; + +import { useActions, useValues } from 'kea'; + +import { + EuiCheckbox, + EuiConfirmModal, + EuiFieldText, + EuiForm, + EuiFormRow, + EuiSpacer, + EuiText, + EuiTextColor, +} from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { FormattedMessage } from '@kbn/i18n-react'; + +import { ConnectorsLogic } from './connectors_logic'; + +export const DeleteConnectorModal: React.FC = () => { + const { closeDeleteModal, deleteConnector } = useActions(ConnectorsLogic); + const { + deleteModalConnectorId: connectorId, + deleteModalConnectorName: connectorName, + deleteModalIndexName, + isDeleteLoading, + isDeleteModalVisible, + } = useValues(ConnectorsLogic); + + const [inputConnectorName, setInputConnectorName] = useState(''); + const [shouldDeleteIndex, setShouldDeleteIndex] = useState(false); + + useEffect(() => { + setShouldDeleteIndex(false); + setInputConnectorName(''); + }, [isDeleteModalVisible]); + + return isDeleteModalVisible ? ( + { + closeDeleteModal(); + }} + onConfirm={() => { + deleteConnector({ + connectorId, + shouldDeleteIndex, + }); + }} + cancelButtonText={ + isDeleteLoading + ? i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.closeButton.title', + { + defaultMessage: 'Close', + } + ) + : i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.cancelButton.title', + { + defaultMessage: 'Cancel', + } + ) + } + confirmButtonText={i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.confirmButton.title', + { + defaultMessage: 'Delete index', + } + )} + defaultFocusedButton="confirm" + buttonColor="danger" + confirmButtonDisabled={inputConnectorName.trim() !== connectorName} + isLoading={isDeleteLoading} + > +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.connectors.deleteModal.delete.description', + { + defaultMessage: 'You are about to delete this connector:', + } + )} +

+

+

    +
  • + +
  • +
+

+

+ + + {connectorName} + + ), + }} + /> + +

+ {deleteModalIndexName && ( + <> + setShouldDeleteIndex(!shouldDeleteIndex)} + /> + + + )} + + + setInputConnectorName(e.target.value)} + value={inputConnectorName} + /> + + +
+ ) : ( + <> + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/index.tsx index 7820ab340b0f9..37b55411487cf 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.tsx @@ -106,6 +106,7 @@ export const renderApp = ( charts, cloud, config, + console: plugins.console, esConfig, data: plugins.data, guidedOnboarding, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts index 201e91b439bc0..7361897b21ef9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts @@ -11,6 +11,7 @@ import { kea, MakeLogicType } from 'kea'; import { ChartsPluginStart } from '@kbn/charts-plugin/public'; import { CloudSetup } from '@kbn/cloud-plugin/public'; +import { ConsolePluginStart } from '@kbn/console-plugin/public'; import { ApplicationStart, Capabilities, @@ -42,6 +43,7 @@ export interface KibanaLogicProps { charts: ChartsPluginStart; cloud?: CloudSetup; config: ClientConfigType; + console?: ConsolePluginStart; data: DataPublicPluginStart; esConfig: ESConfig; guidedOnboarding?: GuidedOnboardingPluginStart; @@ -62,8 +64,9 @@ export interface KibanaLogicProps { user: AuthenticatedUser | null; } -export interface KibanaValues extends Omit { +export interface KibanaValues extends Omit { cloud: Partial; + consolePlugin: Partial; data: DataPublicPluginStart; isCloud: boolean; lens: LensPublicStart; @@ -78,6 +81,7 @@ export const KibanaLogic = kea>({ charts: [props.charts, {}], cloud: [props.cloud || {}, {}], config: [props.config || {}, {}], + consolePlugin: [props.console || {}, {}], data: [props.data, {}], esConfig: [props.esConfig || { elasticsearch_host: ELASTICSEARCH_URL_PLACEHOLDER }, {}], guidedOnboarding: [props.guidedOnboarding, {}], 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 dc73570f0c209..a4658f5c04b4b 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 @@ -228,4 +228,41 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { }); }); }); + + describe('Embedded Console', () => { + it('renders embedded console if available', () => { + const renderMock = jest.fn(); + renderMock.mockReturnValue(null); + + setMockValues({ + readOnlyMode: false, + consolePlugin: { renderEmbeddableConsole: renderMock }, + }); + + shallow( + +
world
+
+ ); + + expect(renderMock).toHaveBeenCalled(); + }); + it('Hides embedded console if available but page template prop set to hide', () => { + const renderMock = jest.fn(); + renderMock.mockReturnValue(null); + + setMockValues({ + readOnlyMode: false, + consolePlugin: { renderEmbeddableConsole: renderMock }, + }); + + shallow( + +
world
+
+ ); + + expect(renderMock).not.toHaveBeenCalled(); + }); + }); }); 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 f0cff6a29880e..2bfb53e859212 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 @@ -47,6 +47,7 @@ export type PageTemplateProps = KibanaPageTemplateProps & { setPageChrome?: React.ReactNode; solutionNavIcon?: string; useEndpointHeaderActions?: boolean; + hideEmbeddedConsole?: boolean; }; export const EnterpriseSearchPageTemplateWrapper: React.FC = ({ @@ -61,10 +62,11 @@ export const EnterpriseSearchPageTemplateWrapper: React.FC = solutionNav, solutionNavIcon, useEndpointHeaderActions = true, + hideEmbeddedConsole = false, ...pageTemplateProps }) => { const { readOnlyMode } = useValues(HttpLogic); - const { renderHeaderActions } = useValues(KibanaLogic); + const { renderHeaderActions, consolePlugin } = useValues(KibanaLogic); const hasCustomEmptyState = !!emptyState; const showCustomEmptyState = hasCustomEmptyState && isEmptyState; @@ -118,6 +120,11 @@ export const EnterpriseSearchPageTemplateWrapper: React.FC = ) : ( {children} )} + {!hideEmbeddedConsole && consolePlugin?.renderEmbeddableConsole !== undefined ? ( + consolePlugin.renderEmbeddableConsole() + ) : ( + <> + )} ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx index 16d29543068f8..b2b2f73e51991 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/page_template.tsx @@ -30,6 +30,7 @@ export const WorkplaceSearchPageTemplate: React.FC = ({ }} setPageChrome={pageChrome && } useEndpointHeaderActions={false} + hideEmbeddedConsole > {pageViewTelemetry && ( diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx index 2e3939675ac69..aee89fa59cb73 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form_page.tsx @@ -57,6 +57,7 @@ export const WorkplaceSearchGatePage: React.FC = ({ isLoading name: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME, }} isLoading={isLoading} + hideEmbeddedConsole > diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index e7b9b862f3d5d..598732c5004d3 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -7,6 +7,7 @@ import { ChartsPluginStart } from '@kbn/charts-plugin/public'; import { CloudSetup, CloudStart } from '@kbn/cloud-plugin/public'; +import { ConsolePluginStart } from '@kbn/console-plugin/public'; import { AppMountParameters, CoreStart, @@ -61,6 +62,7 @@ interface PluginsSetup { export interface PluginsStart { charts: ChartsPluginStart; cloud?: CloudSetup & CloudStart; + console?: ConsolePluginStart; data: DataPublicPluginStart; guidedOnboarding: GuidedOnboardingPluginStart; lens: LensPublicStart; diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index cc071d41ccd47..e1b5b399dc3a0 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -8,6 +8,8 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; import { + deleteConnectorById, + fetchConnectorById, fetchConnectors, fetchSyncJobsByConnectorId, putUpdateNative, @@ -22,11 +24,14 @@ import { import { ConnectorStatus, FilteringRule, SyncJobType } from '@kbn/search-connectors'; import { cancelSyncs } from '@kbn/search-connectors/lib/cancel_syncs'; +import { isResourceNotFoundException } from '@kbn/search-connectors/utils/identify_exceptions'; import { ErrorCode } from '../../../common/types/error_codes'; import { addConnector } from '../../lib/connectors/add_connector'; import { startSync } from '../../lib/connectors/start_sync'; +import { deleteAccessControlIndex } from '../../lib/indices/delete_access_control_index'; import { fetchIndexCounts } from '../../lib/indices/fetch_index_counts'; +import { deleteIndexPipelines } from '../../lib/pipelines/delete_pipelines'; import { getDefaultPipeline } from '../../lib/pipelines/get_default_pipeline'; import { updateDefaultPipeline } from '../../lib/pipelines/update_default_pipeline'; import { updateConnectorPipeline } from '../../lib/pipelines/update_pipeline'; @@ -37,6 +42,7 @@ import { elasticsearchErrorHandler } from '../../utils/elasticsearch_error_handl import { isAccessControlDisabledException, isExpensiveQueriesNotAllowedException, + isIndexNotFoundException, } from '../../utils/identify_exceptions'; export function registerConnectorRoutes({ router, log }: RouteDependencies) { @@ -539,4 +545,66 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { }); }) ); + + router.delete( + { + path: '/internal/enterprise_search/connectors/{connectorId}', + validate: { + params: schema.object({ + connectorId: schema.string(), + }), + query: schema.object({ + shouldDeleteIndex: schema.maybe(schema.boolean()), + }), + }, + }, + elasticsearchErrorHandler(log, async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + const { connectorId } = request.params; + const { shouldDeleteIndex } = request.query; + + let connectorResponse; + let indexNameToDelete; + try { + if (shouldDeleteIndex) { + const connector = await fetchConnectorById(client.asCurrentUser, connectorId); + indexNameToDelete = connector?.value.index_name; + } + connectorResponse = await deleteConnectorById(client.asCurrentUser, connectorId); + if (indexNameToDelete) { + await deleteIndexPipelines(client, indexNameToDelete); + await deleteAccessControlIndex(client, indexNameToDelete); + await client.asCurrentUser.indices.delete({ index: indexNameToDelete }); + } + } catch (error) { + if (isResourceNotFoundException(error)) { + return createError({ + errorCode: ErrorCode.RESOURCE_NOT_FOUND, + message: i18n.translate( + 'xpack.enterpriseSearch.server.routes.connectors.resource_not_found_error', + { + defaultMessage: 'Connector with id {connectorId} is not found.', + values: { connectorId }, + } + ), + response, + statusCode: 404, + }); + } + + if (isIndexNotFoundException(error)) { + return createError({ + errorCode: ErrorCode.INDEX_NOT_FOUND, + message: 'Could not find index', + response, + statusCode: 404, + }); + } + + throw error; + } + + return response.ok({ body: connectorResponse }); + }) + ); } diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index fd433977c09ea..9ed91655f25af 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -66,6 +66,7 @@ "@kbn/core-application-browser", "@kbn/core-capabilities-common", "@kbn/react-kibana-context-theme", - "@kbn/code-editor" + "@kbn/code-editor", + "@kbn/console-plugin" ] } diff --git a/x-pack/plugins/fleet/common/constants/output.ts b/x-pack/plugins/fleet/common/constants/output.ts index 4d75f79df0a26..cdd52a42f3e6c 100644 --- a/x-pack/plugins/fleet/common/constants/output.ts +++ b/x-pack/plugins/fleet/common/constants/output.ts @@ -122,12 +122,12 @@ export const kafkaSupportedVersions = [ export const RESERVED_CONFIG_YML_KEYS = [ 'bulk_max_size', - 'workers', + 'compression_level', + 'connection_idle_timeout', 'queue.mem.events', - 'flush.min_events', - 'flush.timeout', - 'compression', - 'idle_timeout', + 'queue.mem.flush.min_events', + 'queue.mem.flush.timeout', + 'workers', ]; export const OUTPUT_TYPES_WITH_PRESET_SUPPORT: Array> = [ diff --git a/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts b/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts index d759811883dc4..cd41b92cb6a8d 100644 --- a/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/fleet_settings_outputs.cy.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { RESERVED_CONFIG_YML_KEYS } from '../../common/constants'; + import { getSpecificSelectorId, SETTINGS_CONFIRM_MODAL_BTN, @@ -32,13 +34,16 @@ import { } from '../screens/fleet_outputs'; import { login } from '../tasks/login'; - import { visit } from '../tasks/common'; export const fillYamlConfigBox = (query: string) => { cy.get('[data-test-subj="kibanaCodeEditor"] textarea').type(query, { force: true }); }; +export const clearYamlConfigBox = () => { + cy.get('[data-test-subj="kibanaCodeEditor"] textarea').clear({ force: true }); +}; + describe('Outputs', () => { beforeEach(() => { login(); @@ -46,16 +51,38 @@ describe('Outputs', () => { describe('Elasticsearch', () => { describe('Preset input', () => { + afterEach(() => { + clearYamlConfigBox(); + cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT).select('balanced'); + }); + it('is set to balanced by default', () => { selectESOutput(); cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT).should('have.value', 'balanced'); }); - it('forces custom when reserved key is included in config YAML box', () => { + for (const keyword of RESERVED_CONFIG_YML_KEYS) { + it(`forces custom when reserved key ${keyword} is included in config YAML box`, () => { + selectESOutput(); + + fillYamlConfigBox(`${keyword}: value`); + + cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT) + .should('have.value', 'custom') + .should('be.disabled'); + }); + } + + it('handles expanded syntax for reserved keys', () => { selectESOutput(); - fillYamlConfigBox('bulk_max_size: 1000'); + fillYamlConfigBox(` +queue: + mem: + flush: + min_events: 100 + `); cy.getBySel(SETTINGS_OUTPUTS.PRESET_INPUT) .should('have.value', 'custom') diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_fleet_server_host.ts b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_fleet_server_host.ts index fef267b057652..9ebb918095e89 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_fleet_server_host.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_fleet_server_host.ts @@ -23,11 +23,10 @@ import { export interface FleetServerHostForm { fleetServerHosts: FleetServerHost[]; - saveFleetServerHost: (host: Omit) => Promise; + handleSubmitForm: () => Promise; isFleetServerHostSubmitted: boolean; fleetServerHost?: FleetServerHost | null; setFleetServerHost: React.Dispatch>; - validate: () => boolean; error?: string; inputs: { hostUrlsInput: ReturnType; @@ -72,38 +71,44 @@ export const useFleetServerHost = (): FleetServerHostForm => { } }, [fleetServerHosts, setDefaultInputValue]); - const saveFleetServerHost = useCallback( - async (newFleetServerHost: Omit) => { - setIsFleetServerHostSubmitted(false); + const handleSubmitForm = useCallback(async () => { + if (!validate()) { + return; + } + setIsFleetServerHostSubmitted(false); + const newFleetServerHost = { + name: inputs.nameInput.value, + host_urls: inputs.hostUrlsInput.value, + is_default: inputs.isDefaultInput.value, + }; - const res = await sendPostFleetServerHost({ - name: newFleetServerHost?.name, - host_urls: newFleetServerHost?.host_urls, - is_default: newFleetServerHost?.is_default, - }); - if (res.error) { - throw res.error; - } - if (!res.data) { - throw new Error('No data'); - } + const res = await sendPostFleetServerHost(newFleetServerHost); + if (res.error) { + throw res.error; + } + if (!res.data) { + throw new Error('No data'); + } - await refreshGetFleetServerHosts(); - setIsFleetServerHostSubmitted(true); - setFleetServerHost(res.data.item); + await refreshGetFleetServerHosts(); + setIsFleetServerHostSubmitted(true); + setFleetServerHost(res.data.item); - return res.data.item; - }, - [refreshGetFleetServerHosts] - ); + return res.data.item; + }, [ + validate, + refreshGetFleetServerHosts, + inputs.nameInput.value, + inputs.hostUrlsInput.value, + inputs.isDefaultInput.value, + ]); return { fleetServerHosts, - saveFleetServerHost, + handleSubmitForm, fleetServerHost, isFleetServerHostSubmitted, setFleetServerHost, - validate, inputs, }; }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_quick_start_form.ts b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_quick_start_form.ts index b760282c80337..e56ae45b1661a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_quick_start_form.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/hooks/use_quick_start_form.ts @@ -64,10 +64,9 @@ export const useQuickStartCreateForm = (): QuickStartCreateForm => { fleetServerHosts, fleetServerHost, isFleetServerHostSubmitted, - saveFleetServerHost, + handleSubmitForm, error: fleetServerError, setFleetServerHost, - validate, inputs, } = useFleetServerHost(); @@ -84,19 +83,17 @@ export const useQuickStartCreateForm = (): QuickStartCreateForm => { const submit = useCallback(async () => { try { - if ((!fleetServerHost && validate()) || fleetServerHost) { + if (!fleetServerHost || fleetServerHost) { setStatus('loading'); - const newFleetServerHost = { - name: inputs.nameInput.value, - host_urls: inputs.hostUrlsInput.value, - is_default: inputs.isDefaultInput.value, - is_preconfigured: false, - }; - if (!fleetServerHost) { - const res = await saveFleetServerHost(newFleetServerHost); - setFleetServerHost(res); + const res = await handleSubmitForm(); + if (res) { + setFleetServerHost(res); + } else { + setStatus('initial'); + return; + } } await generateServiceToken(); @@ -131,13 +128,9 @@ export const useQuickStartCreateForm = (): QuickStartCreateForm => { setError(err.message); } }, [ - validate, fleetServerHost, - inputs.nameInput.value, - inputs.hostUrlsInput.value, - inputs.isDefaultInput.value, + handleSubmitForm, setFleetServerHost, - saveFleetServerHost, generateServiceToken, setFleetServerPolicyId, notifications.toasts, diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/add_fleet_server_host.tsx b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/add_fleet_server_host.tsx index debefdb5ca997..8d196916fb2e8 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/add_fleet_server_host.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/components/fleet_server_instructions/steps/add_fleet_server_host.tsx @@ -61,10 +61,9 @@ export const AddFleetServerHostStepContent = ({ const { setFleetServerHost, fleetServerHost: selectedFleetServerHost, - saveFleetServerHost, + handleSubmitForm, fleetServerHosts, error, - validate, inputs, } = fleetServerHostForm; const [isLoading, setIsLoading] = useState(false); @@ -77,17 +76,10 @@ export const AddFleetServerHostStepContent = ({ setSubmittedFleetServerHost(undefined); setIsLoading(true); - const newFleetServerHost = { - name: inputs.nameInput.value, - host_urls: inputs.hostUrlsInput.value, - is_default: true, - id: 'fleet-server-host', - is_preconfigured: false, - }; - - if (validate()) { - setFleetServerHost(await saveFleetServerHost(newFleetServerHost)); - setSubmittedFleetServerHost(newFleetServerHost); + const savedFleetServerHost = await handleSubmitForm(); + if (savedFleetServerHost) { + setFleetServerHost(savedFleetServerHost); + setSubmittedFleetServerHost(savedFleetServerHost); } } catch (err) { notifications.toasts.addError(err, { @@ -98,14 +90,7 @@ export const AddFleetServerHostStepContent = ({ } finally { setIsLoading(false); } - }, [ - inputs.nameInput.value, - inputs.hostUrlsInput.value, - setFleetServerHost, - validate, - saveFleetServerHost, - notifications.toasts, - ]); + }, [handleSubmitForm, setFleetServerHost, notifications.toasts]); return ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx index 0a723bab1b969..5756f1fee4dca 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_list_table.tsx @@ -52,7 +52,7 @@ interface Props { sortField: keyof Agent; sortOrder: 'asc' | 'desc'; onSelectionChange: (agents: Agent[]) => void; - tableRef?: React.Ref; + selected: Agent[]; showUpgradeable: boolean; totalAgents?: number; pagination: Pagination; @@ -77,9 +77,9 @@ export const AgentListTable: React.FC = (props: Props) => { renderActions, sortField, sortOrder, - tableRef, onTableChange, onSelectionChange, + selected, totalAgents = 0, showUpgradeable, pagination, @@ -318,7 +318,6 @@ export const AgentListTable: React.FC = (props: Props) => { return ( - ref={tableRef} className="fleet__agentList__table" data-test-subj="fleetAgentListTable" loading={isLoading} @@ -341,6 +340,7 @@ export const AgentListTable: React.FC = (props: Props) => { }} isSelectable={true} selection={{ + selected, onSelectionChange, selectable: isAgentSelectable, selectableMessage: (selectable, agent) => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index af91e65a40313..afa26547fecc7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -4,9 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useState, useMemo, useCallback, useRef } from 'react'; +import React, { useState, useMemo, useCallback } from 'react'; import { differenceBy, isEqual } from 'lodash'; -import type { EuiBasicTable } from '@elastic/eui'; import { EuiSpacer, EuiPortal } from '@elastic/eui'; import type { Agent } from '../../../types'; @@ -49,7 +48,6 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { // Table and search states const [selectedAgents, setSelectedAgents] = useState([]); const [selectionMode, setSelectionMode] = useState('manual'); - const tableRef = useRef>(null); const { allTags, @@ -208,21 +206,19 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { ); const onSelectionChange = (newAgents: Agent[]) => { - setSelectedAgents(newAgents); if (selectionMode === 'query' && newAgents.length < selectedAgents.length) { // differentiating between selection changed by agents dropping from current page or user action const areSelectedAgentsStillVisible = selectedAgents.length > 0 && differenceBy(selectedAgents, agentsOnCurrentPage, 'id').length === 0; - if (areSelectedAgentsStillVisible) { - setSelectionMode('manual'); - } else { + if (!areSelectedAgentsStillVisible) { // force selecting all agents on current page if staying in query mode - if (tableRef?.current) { - tableRef.current.setSelection(agentsOnCurrentPage); - } + return setSelectedAgents(agentsOnCurrentPage); + } else { + setSelectionMode('manual'); } } + setSelectedAgents(newAgents); }; const agentToUnenrollHasFleetServer = useMemo(() => { @@ -429,10 +425,8 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { setSelectionMode={setSelectionMode} selectedAgents={selectedAgents} setSelectedAgents={(newAgents: Agent[]) => { - if (tableRef?.current) { - tableRef.current.setSelection(newAgents); - setSelectionMode('manual'); - } + setSelectedAgents(newAgents); + setSelectionMode('manual'); }} clearFilters={clearFilters} isUsingFilter={isUsingFilter} @@ -448,7 +442,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { agentPoliciesIndexedById={agentPoliciesIndexedById} renderActions={renderActions} onSelectionChange={onSelectionChange} - tableRef={tableRef} + selected={selectedAgents} showUpgradeable={showUpgradeable} onTableChange={onTableChange} pagination={pagination} diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx index 9813f604e58d2..fa6eeb36cdf34 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx @@ -82,7 +82,7 @@ describe('', () => { isLoadingServiceToken: false, generateServiceToken: jest.fn(), fleetServerHostForm: { - saveFleetServerHost: jest.fn(), + submitForm: jest.fn(), fleetServerHost: 'https://test.server:8220', setFleetServerHost: jest.fn(), error: '', diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts index 65c37120e552f..302b92a98407e 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_create_route.ts @@ -33,6 +33,7 @@ async function createPolicy( */ const bodySchema = schema.object({ name: schema.string(), + deprecated: schema.maybe(schema.boolean()), phases: schema.object({ hot: schema.any(), warm: schema.maybe(schema.any()), diff --git a/x-pack/plugins/index_management/public/application/lib/edit_settings.ts b/x-pack/plugins/index_management/public/application/lib/edit_settings.ts index 16a67633224a9..ea935ea7c9cb6 100644 --- a/x-pack/plugins/index_management/public/application/lib/edit_settings.ts +++ b/x-pack/plugins/index_management/public/application/lib/edit_settings.ts @@ -27,12 +27,15 @@ export const limitedEditableSettings = [ 'index.blocks.write', 'index.blocks.read', 'index.blocks.read_only', + 'index.codec', 'index.default_pipeline', 'index.lifecycle.origination_date', 'index.final_pipeline', 'index.query.default_field', 'index.refresh_interval', + 'index.query_string.lenient', 'index.mapping.ignore_malformed', + 'index.mapping.coerce', 'index.mapping.total_fields.limit', 'index.merge.policy.deletes_pct_allowed', 'index.merge.policy.max_merge_at_once', diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx index 00b6f779d2c40..7b0bd29e307df 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_content.tsx @@ -58,9 +58,7 @@ const defaultTabs: IndexDetailsTab[] = [ name: ( ), - renderTabContent: ({ index }) => ( - - ), + renderTabContent: ({ index }) => , order: 30, }, ]; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx index 2c6d9a2a36330..bf169ac2b9e5e 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_settings.tsx @@ -16,8 +16,7 @@ import { DetailsPageSettingsContent } from './details_page_settings_content'; export const DetailsPageSettings: FunctionComponent<{ indexName: string; - isIndexOpen: boolean; -}> = ({ indexName, isIndexOpen }) => { +}> = ({ indexName }) => { const { isLoading, data, error, resendRequest } = useLoadIndexSettings(indexName); useEffect(() => { @@ -79,7 +78,6 @@ export const DetailsPageSettings: FunctionComponent<{ } return ( ; settingsString: string } => { const { defaults, settings } = data; @@ -62,23 +61,17 @@ const getEditableSettings = ({ readOnlySettings.forEach((e) => delete newSettings[e]); } - // can't change codec on an open index - if (isIndexOpen) { - delete newSettings['index.codec']; - } const settingsString = JSON.stringify(newSettings, null, 2); return { originalSettings: newSettings, settingsString }; }; interface Props { - isIndexOpen: boolean; data: IndexSettingsResponse; indexName: string; reloadIndexSettings: () => void; } export const DetailsPageSettingsContent: FunctionComponent = ({ - isIndexOpen, data, indexName, reloadIndexSettings, @@ -94,7 +87,6 @@ export const DetailsPageSettingsContent: FunctionComponent = ({ const { originalSettings, settingsString } = getEditableSettings({ data, - isIndexOpen, editableIndexSettings, }); const [editableSettings, setEditableSettings] = useState(settingsString); @@ -152,6 +144,14 @@ export const DetailsPageSettingsContent: FunctionComponent = ({ }); } }, [originalSettings, editableSettings, indexName, reloadIndexSettings]); + const settingsSchemaProperties = {} as Record; + Object.keys(originalSettings).forEach( + // allow any type of value + (setting) => + (settingsSchemaProperties[setting] = { + type: ['null', 'boolean', 'object', 'array', 'number', 'string'], + }) + ); return ( // using "rowReverse" to keep the card on the left side to be on top of the code block on smaller screens = ({ {isEditMode ? ( { + monacoEditor.languages.json.jsonDefaults.setDiagnosticsOptions({ + validate: true, + schemas: [ + { + uri: editor.getModel()?.uri.toString() ?? '', + fileMatch: ['*'], + schema: { + type: 'object', + properties: settingsSchemaProperties, + }, + }, + ], + }); + }} value={editableSettings} data-test-subj="indexDetailsSettingsEditor" options={{ diff --git a/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts b/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts index cfb0be50e0484..730c7a3b24274 100644 --- a/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts @@ -29,6 +29,7 @@ export function registerUpdateRoute({ router, lib: { handleEsError } }: RouteDep ignore_unavailable: true, allow_no_indices: false, expand_wildcards: 'none' as const, + reopen: true, index: indexName, body: request.body, }; diff --git a/x-pack/plugins/index_management/tsconfig.json b/x-pack/plugins/index_management/tsconfig.json index e9e76a18f8fd0..50181a03e3f19 100644 --- a/x-pack/plugins/index_management/tsconfig.json +++ b/x-pack/plugins/index_management/tsconfig.json @@ -43,6 +43,7 @@ "@kbn/ui-theme", "@kbn/core-application-browser", "@kbn/code-editor", + "@kbn/monaco", "@kbn/console-plugin", ], "exclude": [ diff --git a/x-pack/plugins/infra/common/http_api/profiling_api.ts b/x-pack/plugins/infra/common/http_api/profiling_api.ts index d6a27155477a9..e7c9600dcd14f 100644 --- a/x-pack/plugins/infra/common/http_api/profiling_api.ts +++ b/x-pack/plugins/infra/common/http_api/profiling_api.ts @@ -8,13 +8,13 @@ import * as rt from 'io-ts'; export const InfraProfilingFlamegraphRequestParamsRT = rt.type({ - hostname: rt.string, + kuery: rt.string, from: rt.number, to: rt.number, }); export const InfraProfilingFunctionsRequestParamsRT = rt.type({ - hostname: rt.string, + kuery: rt.string, from: rt.number, to: rt.number, startIndex: rt.number, diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts index 42abaf1c5bc91..aa9e58c430b21 100644 --- a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts @@ -69,6 +69,7 @@ const AssetDetailsUrlStateRT = rt.partial({ processSearch: rt.string, metadataSearch: rt.string, logsSearch: rt.string, + profilingSearch: rt.string, }); const AssetDetailsUrlRT = rt.union([AssetDetailsUrlStateRT, rt.null]); diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.test.tsx b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.test.tsx new file mode 100644 index 0000000000000..f5bd973aca2ec --- /dev/null +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.test.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { MemoryRouter, useHistory } from 'react-router-dom'; +import { renderHook, act } from '@testing-library/react-hooks'; +import { useProfilingKuery } from './use_profiling_kuery'; +import { useAssetDetailsRenderPropsContext } from './use_asset_details_render_props'; + +jest.mock('./use_asset_details_render_props'); + +describe('useProfilingKuery', () => { + const asset = { name: 'test-host' }; + + beforeEach(() => { + (useAssetDetailsRenderPropsContext as jest.Mock).mockReturnValue({ asset }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('gets initial search value from the URL if present', () => { + const { result } = renderHook(() => useProfilingKuery(), { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(result.current.fullKuery).toBe('host.name : "test-host" and Stacktrace.count >= 5'); + expect(result.current.customKuery).toBe('Stacktrace.count >= 5'); + }); + + it('saves new custom kuery to the URL', () => { + const { result } = renderHook( + () => ({ profilingKuery: useProfilingKuery(), history: useHistory() }), + { + wrapper: ({ children }) => ( + {children} + ), + } + ); + + act(() => { + result.current.profilingKuery.setCustomKuery('Stacktrace.count > 5'); + }); + + expect(result.current.history.location.search).toBe( + encodeURI("?assetDetails=(profilingSearch:'Stacktrace.count > 5')") + ); + }); +}); diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.ts new file mode 100644 index 0000000000000..10fb9b90cb090 --- /dev/null +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profiling_kuery.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState } from 'react'; +import { HOST_FIELD } from '../../../../common/constants'; +import { useAssetDetailsRenderPropsContext } from './use_asset_details_render_props'; +import { useAssetDetailsUrlState } from './use_asset_details_url_state'; + +function buildFullProfilingKuery(assetName: string, profilingSearch?: string) { + const defaultKuery = `${HOST_FIELD} : "${assetName}"`; + const customKuery = profilingSearch?.trim() ?? ''; + + return customKuery !== '' ? `${defaultKuery} and ${customKuery}` : defaultKuery; +} +export function useProfilingKuery() { + const { asset } = useAssetDetailsRenderPropsContext(); + const [assetDetailsUrlState, setAssetDetailsUrlState] = useAssetDetailsUrlState(); + const [fullKuery, setFullKuery] = useState( + buildFullProfilingKuery(asset.name, assetDetailsUrlState?.profilingSearch) + ); + + const setCustomKuery = (customKuery: string) => { + setAssetDetailsUrlState({ profilingSearch: customKuery }); + setFullKuery(buildFullProfilingKuery(asset.name, customKuery)); + }; + + return { + fullKuery, + customKuery: assetDetailsUrlState?.profilingSearch ?? '', + setCustomKuery, + } as const; +} diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx index 80a7f0ad8539c..c8c1d6fe18b84 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/flamegraph.tsx @@ -19,7 +19,11 @@ import { ErrorPrompt } from './error_prompt'; import { ProfilingLinks } from './profiling_links'; import { EmptyDataPrompt } from './empty_data_prompt'; -export function Flamegraph() { +interface Props { + kuery: string; +} + +export function Flamegraph({ kuery }: Props) { const { services } = useKibanaContextForPlugin(); const { asset } = useAssetDetailsRenderPropsContext(); const { activeTabId } = useTabSwitcherContext(); @@ -31,14 +35,7 @@ export function Flamegraph() { defaultMessage: 'Go to Universal Profiling Flamegraph', }); - const params = useMemo( - () => ({ - hostname: asset.name, - from, - to, - }), - [asset.name, from, to] - ); + const params = useMemo(() => ({ kuery, from, to }), [from, kuery, to]); const { error, loading, response } = useProfilingFlamegraphData({ isActive: activeTabId === ContentTabIds.PROFILING, params, diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx index 5e3cf66ae8429..5dcf851897e5c 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/functions.tsx @@ -19,7 +19,11 @@ import { ErrorPrompt } from './error_prompt'; import { ProfilingLinks } from './profiling_links'; import { EmptyDataPrompt } from './empty_data_prompt'; -export function Functions() { +interface Props { + kuery: string; +} + +export function Functions({ kuery }: Props) { const { services } = useKibanaContextForPlugin(); const { asset } = useAssetDetailsRenderPropsContext(); const { activeTabId } = useTabSwitcherContext(); @@ -33,13 +37,13 @@ export function Functions() { const params = useMemo( () => ({ - hostname: asset.name, + kuery, from, to, startIndex: 0, endIndex: 10, }), - [asset.name, from, to] + [kuery, from, to] ); const { error, loading, response } = useProfilingFunctionsData({ diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx index 527ddcc59cb50..2901c7742f7f7 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx @@ -7,15 +7,17 @@ import { i18n } from '@kbn/i18n'; import { EuiLink, EuiSpacer, EuiTabbedContent, type EuiTabbedContentProps } from '@elastic/eui'; -import React from 'react'; -import { ProfilingEmptyState } from '@kbn/observability-shared-plugin/public'; +import React, { useCallback } from 'react'; +import { + EmbeddableProfilingSearchBar, + ProfilingEmptyState, +} from '@kbn/observability-shared-plugin/public'; import { EuiLoadingSpinner } from '@elastic/eui'; import { css } from '@emotion/react'; import { EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { Flamegraph } from './flamegraph'; import { Functions } from './functions'; -import { DatePicker } from '../../date_picker/date_picker'; import { useProfilingStatusData } from '../../hooks/use_profiling_status_data'; import { useTabSwitcherContext } from '../../hooks/use_tab_switcher'; import { ContentTabIds } from '../../types'; @@ -23,13 +25,28 @@ import { ErrorPrompt } from './error_prompt'; import { Threads } from './threads'; import { DescriptionCallout } from './description_callout'; import { Popover } from '../common/popover'; +import { useDatePickerContext } from '../../hooks/use_date_picker'; +import { useProfilingKuery } from '../../hooks/use_profiling_kuery'; export function Profiling() { const { activeTabId } = useTabSwitcherContext(); + const { dateRange, setDateRange } = useDatePickerContext(); + const { fullKuery, customKuery, setCustomKuery } = useProfilingKuery(); const { error, loading, response } = useProfilingStatusData({ isActive: activeTabId === ContentTabIds.PROFILING, }); + const onSearchSubmit = useCallback( + ({ dateRange: range, query }) => { + setDateRange(range); + setCustomKuery(query); + }, + [setCustomKuery, setDateRange] + ); + const onSearchRefresh = useCallback(() => { + setDateRange(dateRange); + }, [dateRange, setDateRange]); + const tabs: EuiTabbedContentProps['tabs'] = [ { id: 'flamegraph', @@ -39,7 +56,7 @@ export function Profiling() { content: ( <> - + ), append: ( @@ -75,7 +92,7 @@ export function Profiling() { content: ( <> - + ), append: ( @@ -111,7 +128,7 @@ export function Profiling() { content: ( <> - + ), append: ( @@ -150,7 +167,14 @@ export function Profiling() { ) : ( <> - + + diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx index 120fe3ca7fd99..837b526e7bf02 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx @@ -10,13 +10,16 @@ import React from 'react'; import { TopNType } from '@kbn/profiling-utils'; import { EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { HOST_FIELD } from '../../../../../common/constants'; import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props'; import { useDatePickerContext } from '../../hooks/use_date_picker'; import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana'; import { ProfilingLinks } from './profiling_links'; -export function Threads() { +interface Props { + kuery: string; +} + +export function Threads({ kuery }: Props) { const { services } = useKibanaContextForPlugin(); const { getDateRangeInTimestamp, dateRange, setDateRange } = useDatePickerContext(); const { from, to } = getDateRangeInTimestamp(); @@ -40,13 +43,13 @@ export function Threads() { type={TopNType.Threads} rangeFrom={from} rangeTo={to} - kuery={`${HOST_FIELD}:"${asset.name}"`} + kuery={kuery} onClick={(category) => { stacktracesProfilingLinkLocator.navigate({ type: TopNType.Traces, rangeFrom: dateRange.from, rangeTo: dateRange.to, - kuery: `(${HOST_FIELD}:"${asset.name}" ) AND process.thread.name:"${category}"`, + kuery: `(${kuery}) AND process.thread.name:"${category}"`, }); }} onChartBrushEnd={(range) => { diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index f89d99a43a57b..0732093e2d7bf 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -128,7 +128,7 @@ export class Plugin implements InfraClientPluginClass { entries: [ { label: 'Explorer', - app: 'observability-log-explorer', + app: 'observability-logs-explorer', path: '/', isBetaFeature: true, }, diff --git a/x-pack/plugins/infra/server/routes/profiling/index.ts b/x-pack/plugins/infra/server/routes/profiling/index.ts index d322fcca37b51..eaba17a8eddec 100644 --- a/x-pack/plugins/infra/server/routes/profiling/index.ts +++ b/x-pack/plugins/infra/server/routes/profiling/index.ts @@ -58,7 +58,7 @@ export function initProfilingRoutes({ framework, getStartServices, logger }: Inf path: '/api/infra/profiling/flamegraph', validate: { query: schema.object({ - hostname: schema.string(), + kuery: schema.string(), from: schema.number(), to: schema.number(), }), @@ -93,7 +93,7 @@ export function initProfilingRoutes({ framework, getStartServices, logger }: Inf path: '/api/infra/profiling/functions', validate: { query: schema.object({ - hostname: schema.string(), + kuery: schema.string(), from: schema.number(), to: schema.number(), startIndex: schema.number(), diff --git a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts index 4f7ff72c3e72f..8b3ab0414f5c8 100644 --- a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts +++ b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamegraph.ts @@ -8,11 +8,10 @@ import type { CoreRequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; import type { ProfilingDataAccessPluginStart } from '@kbn/profiling-data-access-plugin/server'; import type { BaseFlameGraph } from '@kbn/profiling-utils'; -import { HOST_FIELD } from '../../../../common/constants'; import type { InfraProfilingFlamegraphRequestParams } from '../../../../common/http_api/profiling_api'; export async function fetchProfilingFlamegraph( - { hostname, from, to }: InfraProfilingFlamegraphRequestParams, + { kuery, from, to }: InfraProfilingFlamegraphRequestParams, profilingDataAccess: ProfilingDataAccessPluginStart, coreRequestContext: CoreRequestHandlerContext ): Promise { @@ -21,6 +20,6 @@ export async function fetchProfilingFlamegraph( esClient: coreRequestContext.elasticsearch.client.asCurrentUser, rangeFromMs: from, rangeToMs: to, - kuery: `${HOST_FIELD} : "${hostname}"`, + kuery, }); } diff --git a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts index d445e364d143c..fb78075ca3545 100644 --- a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts +++ b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_functions.ts @@ -8,7 +8,6 @@ import type { CoreRequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; import type { ProfilingDataAccessPluginStart } from '@kbn/profiling-data-access-plugin/server'; import type { TopNFunctions } from '@kbn/profiling-utils'; -import { HOST_FIELD } from '../../../../common/constants'; import type { InfraProfilingFunctionsRequestParams } from '../../../../common/http_api/profiling_api'; export async function fetchProfilingFunctions( @@ -16,14 +15,14 @@ export async function fetchProfilingFunctions( profilingDataAccess: ProfilingDataAccessPluginStart, coreRequestContext: CoreRequestHandlerContext ): Promise { - const { hostname, from, to, startIndex, endIndex } = params; + const { kuery, from, to, startIndex, endIndex } = params; return await profilingDataAccess.services.fetchFunction({ core: coreRequestContext, esClient: coreRequestContext.elasticsearch.client.asCurrentUser, rangeFromMs: from, rangeToMs: to, - kuery: `${HOST_FIELD} : "${hostname}"`, + kuery, startIndex, endIndex, }); diff --git a/x-pack/plugins/lens/public/embeddable/index.ts b/x-pack/plugins/lens/public/embeddable/index.ts index 641601a2be3be..37bd92c53a9a3 100644 --- a/x-pack/plugins/lens/public/embeddable/index.ts +++ b/x-pack/plugins/lens/public/embeddable/index.ts @@ -6,3 +6,5 @@ */ export * from './embeddable'; + +export { type HasLensConfig, apiHasLensConfig } from './interfaces/has_lens_config'; diff --git a/x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts b/x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts new file mode 100644 index 0000000000000..39bb91c5c8fe6 --- /dev/null +++ b/x-pack/plugins/lens/public/embeddable/interfaces/has_lens_config.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { type HasType, apiIsOfType } from '@kbn/presentation-publishing'; +import { Document } from '../../persistence'; + +export type HasLensConfig = HasType<'lens'> & { + getSavedVis: () => Readonly; +}; + +export const apiHasLensConfig = (api: unknown): api is HasLensConfig => { + return Boolean( + api && apiIsOfType(api, 'lens') && typeof (api as HasLensConfig).getSavedVis === 'function' + ); +}; diff --git a/x-pack/plugins/lens/public/index.ts b/x-pack/plugins/lens/public/index.ts index a9f8e0eba3dc4..2bf09422986e9 100644 --- a/x-pack/plugins/lens/public/index.ts +++ b/x-pack/plugins/lens/public/index.ts @@ -7,6 +7,7 @@ import { LensPlugin } from './plugin'; +export { apiHasLensConfig } from './embeddable/interfaces/has_lens_config'; export type { EmbeddableComponentProps, EmbeddableComponent, @@ -109,6 +110,7 @@ export type { export type { InlineEditLensEmbeddableContext } from './trigger_actions/open_lens_config/in_app_embeddable_edit/types'; export type { + HasLensConfig, LensEmbeddableInput, LensSavedObjectAttributes, Embeddable, diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 9338b9df054ba..01470e01785f6 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -107,7 +107,8 @@ "@kbn/shared-ux-utility", "@kbn/text-based-editor", "@kbn/managed-content-badge", - "@kbn/sort-predicates" + "@kbn/sort-predicates", + "@kbn/presentation-publishing" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts b/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts index 93a74b2adc1ea..46f7b9cf27be5 100644 --- a/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts +++ b/x-pack/plugins/maps/public/legacy_visualizations/is_legacy_map.ts @@ -5,10 +5,8 @@ * 2.0. */ -import type { HasType } from '@kbn/presentation-publishing'; import { Embeddable } from '@kbn/embeddable-plugin/public'; import type { HasVisualizeConfig, VisualizeEmbeddable } from '@kbn/visualizations-plugin/public'; -import { apiHasVisualizeConfig } from '@kbn/visualizations-plugin/public'; export function isLegacyMap(embeddable: Embeddable) { return ( @@ -18,11 +16,6 @@ export function isLegacyMap(embeddable: Embeddable) { ); } -type LegacyMapApi = HasType & Partial; - -export function isLegacyMapApi(api: LegacyMapApi) { - if (api.type !== 'visualization' || !apiHasVisualizeConfig(api)) { - return false; - } +export function isLegacyMapApi(api: HasVisualizeConfig) { return ['region_map', 'tile_map'].includes(api.getVis().type?.name); } diff --git a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts index 5bd55e65b6fe0..a368dc65b26fe 100644 --- a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts +++ b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/action.ts @@ -6,8 +6,9 @@ */ import { i18n } from '@kbn/i18n'; -import { type EmbeddableApiContext, apiHasType } from '@kbn/presentation-publishing'; +import { type EmbeddableApiContext, apiHasType, apiIsOfType } from '@kbn/presentation-publishing'; import { createAction } from '@kbn/ui-actions-plugin/public'; +import { apiHasVisualizeConfig } from '@kbn/visualizations-plugin/public'; import { type FilterByMapExtentActionApi } from './types'; import { MAP_SAVED_OBJECT_TYPE } from '../../../common/constants'; import { isLegacyMapApi } from '../../legacy_visualizations/is_legacy_map'; @@ -52,10 +53,11 @@ export const filterByMapExtentAction = createAction({ return 'filter'; }, isCompatible: async ({ embeddable }: EmbeddableApiContext) => { - if (!isApiCompatible(embeddable)) return false; - return embeddable.disableTriggers - ? false - : embeddable.type === MAP_SAVED_OBJECT_TYPE || isLegacyMapApi(embeddable); + if (!isApiCompatible(embeddable) || embeddable.disableTriggers) return false; + return ( + apiIsOfType(embeddable, MAP_SAVED_OBJECT_TYPE) || + (apiHasVisualizeConfig(embeddable) && isLegacyMapApi(embeddable)) + ); }, execute: async ({ embeddable }: EmbeddableApiContext) => { const { openModal } = await import('./modal'); diff --git a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts index b5de10937c3d4..a397c627c5a36 100644 --- a/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts +++ b/x-pack/plugins/maps/public/trigger_actions/filter_by_map_extent/types.ts @@ -8,5 +8,5 @@ import type { HasDisableTriggers, HasParentApi, HasType } from '@kbn/presentation-publishing'; import type { HasVisualizeConfig } from '@kbn/visualizations-plugin/public'; -export type FilterByMapExtentActionApi = HasType & +export type FilterByMapExtentActionApi = HasType<'visualization' | 'map'> & Partial & HasVisualizeConfig>; diff --git a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts index 3a3fd78072865..880172a982181 100644 --- a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts +++ b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/action.ts @@ -6,16 +6,20 @@ */ import { i18n } from '@kbn/i18n'; +import { type EmbeddableApiContext, apiHasType } from '@kbn/presentation-publishing'; import { createAction } from '@kbn/ui-actions-plugin/public'; -import type { SynchronizeMovementActionContext } from './types'; +import type { SynchronizeMovementActionApi } from './types'; export const SYNCHRONIZE_MOVEMENT_ACTION = 'SYNCHRONIZE_MOVEMENT_ACTION'; -export const synchronizeMovementAction = createAction({ +export const isApiCompatible = (api: unknown | null): api is SynchronizeMovementActionApi => + Boolean(apiHasType(api)); + +export const synchronizeMovementAction = createAction({ id: SYNCHRONIZE_MOVEMENT_ACTION, type: SYNCHRONIZE_MOVEMENT_ACTION, order: 21, - getDisplayName: ({ embeddable }: SynchronizeMovementActionContext) => { + getDisplayName: () => { return i18n.translate('xpack.maps.synchronizeMovementAction.title', { defaultMessage: 'Synchronize map movement', }); @@ -29,11 +33,12 @@ export const synchronizeMovementAction = createAction { return 'crosshairs'; }, - isCompatible: async (context: SynchronizeMovementActionContext) => { + isCompatible: async ({ embeddable }: EmbeddableApiContext) => { + if (!isApiCompatible(embeddable)) return false; const { isCompatible } = await import('./is_compatible'); - return isCompatible(context); + return isCompatible(embeddable); }, - execute: async (context: SynchronizeMovementActionContext) => { + execute: async () => { const { openModal } = await import('./modal'); openModal(); }, diff --git a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts index ef73f8bb23d11..bd31feb04f00e 100644 --- a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts +++ b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/is_compatible.ts @@ -5,28 +5,21 @@ * 2.0. */ -import type { Embeddable as LensEmbeddable } from '@kbn/lens-plugin/public'; +import { apiIsOfType } from '@kbn/presentation-publishing'; +import { apiHasVisualizeConfig } from '@kbn/visualizations-plugin/public'; +import { apiHasLensConfig } from '@kbn/lens-plugin/public'; import { MAP_SAVED_OBJECT_TYPE } from '../../../common/constants'; -import { isLegacyMap } from '../../legacy_visualizations/is_legacy_map'; +import { isLegacyMapApi } from '../../legacy_visualizations/is_legacy_map'; import { mapEmbeddablesSingleton } from '../../embeddable/map_embeddables_singleton'; -import type { SynchronizeMovementActionContext } from './types'; +import type { SynchronizeMovementActionApi } from './types'; -export function isCompatible({ embeddable }: SynchronizeMovementActionContext) { +export function isCompatible(api: SynchronizeMovementActionApi) { if (!mapEmbeddablesSingleton.hasMultipleMaps()) { return false; } - - if ( - embeddable.type === 'lens' && - typeof (embeddable as LensEmbeddable).getSavedVis === 'function' && - (embeddable as LensEmbeddable).getSavedVis()?.visualizationType === 'lnsChoropleth' - ) { - return true; - } - - if (isLegacyMap(embeddable)) { - return true; - } - - return embeddable.type === MAP_SAVED_OBJECT_TYPE; + return ( + apiIsOfType(api, MAP_SAVED_OBJECT_TYPE) || + (apiHasLensConfig(api) && api.getSavedVis()?.visualizationType === 'lnsChoropleth') || + (apiHasVisualizeConfig(api) && isLegacyMapApi(api)) + ); } diff --git a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts index 8b0060ab1efe6..4b9e48e19c2d0 100644 --- a/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts +++ b/x-pack/plugins/maps/public/trigger_actions/synchronize_movement/types.ts @@ -5,8 +5,10 @@ * 2.0. */ -import type { Embeddable, EmbeddableInput } from '@kbn/embeddable-plugin/public'; +import type { HasType } from '@kbn/presentation-publishing'; +import type { HasLensConfig } from '@kbn/lens-plugin/public'; +import type { HasVisualizeConfig } from '@kbn/visualizations-plugin/public'; -export interface SynchronizeMovementActionContext { - embeddable: Embeddable; -} +export type SynchronizeMovementActionApi = + | HasType<'map' | 'visualization' | 'lens'> + | Partial; diff --git a/x-pack/plugins/ml/public/application/components/feedback_button/feature_feedback_button.tsx b/x-pack/plugins/ml/public/application/components/feedback_button/feature_feedback_button.tsx new file mode 100644 index 0000000000000..ae96787202cf9 --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/feedback_button/feature_feedback_button.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 React, { ReactElement } from 'react'; +import { EuiButton } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +const KIBANA_VERSION_QUERY_PARAM = 'entry.548460210'; +const KIBANA_DEPLOYMENT_TYPE_PARAM = 'entry.573002982'; +const SANITIZED_PATH_PARAM = 'entry.1876422621'; + +const getDeploymentType = (isCloudEnv?: boolean, isServerlessEnv?: boolean): string | undefined => { + if (isServerlessEnv) { + return 'Serverless (fully-managed projects)'; + } + if (isCloudEnv) { + return 'Elastic Cloud (we manage)'; + } + return 'Self-Managed (you manage)'; +}; + +const getSurveyFeedbackURL = ( + formUrl: string, + kibanaVersion?: string, + deploymentType?: string, + sanitizedPath?: string +) => { + const url = new URL(formUrl); + if (kibanaVersion) { + url.searchParams.append(KIBANA_VERSION_QUERY_PARAM, kibanaVersion); + } + if (deploymentType) { + url.searchParams.append(KIBANA_DEPLOYMENT_TYPE_PARAM, deploymentType); + } + if (sanitizedPath) { + url.searchParams.append(SANITIZED_PATH_PARAM, sanitizedPath); + } + + return url.href; +}; + +interface FeatureFeedbackButtonProps { + formUrl: string; + 'data-test-subj': string; + surveyButtonText?: ReactElement; + onClickCapture?: () => void; + defaultButton?: boolean; + kibanaVersion?: string; + isCloudEnv?: boolean; + isServerlessEnv?: boolean; + sanitizedPath?: string; +} + +export const FeatureFeedbackButton = ({ + formUrl, + 'data-test-subj': dts, + onClickCapture, + defaultButton, + kibanaVersion, + isCloudEnv, + isServerlessEnv, + sanitizedPath, + surveyButtonText = ( + + ), +}: FeatureFeedbackButtonProps) => { + const deploymentType = + isCloudEnv !== undefined || isServerlessEnv !== undefined + ? getDeploymentType(isCloudEnv, isServerlessEnv) + : undefined; + + return ( + + {surveyButtonText} + + ); +}; diff --git a/x-pack/plugins/ml/public/application/components/feedback_button/feedback_button.tsx b/x-pack/plugins/ml/public/application/components/feedback_button/feedback_button.tsx new file mode 100644 index 0000000000000..b543debda347a --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/feedback_button/feedback_button.tsx @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useEffect, FC, useMemo } from 'react'; +import useMountedState from 'react-use/lib/useMountedState'; +import { MlPages, ML_PAGES } from '../../../locator'; +import { useMlKibana } from '../../contexts/kibana'; +import { useEnabledFeatures } from '../../contexts/ml'; + +import { useJobsApiService } from '../../services/ml_api_service/jobs'; +import { useCloudCheck } from '../node_available_warning/hooks'; +import { FeatureFeedbackButton } from './feature_feedback_button'; + +interface Props { + jobIds: string[]; + page: MlPages; +} + +const FORM_IDS = { + SINGLE_METRIC_VIEWER: '1FAIpQLSdlMYe3wuJh2KtBLajI4EVoUljAhGjJwjZI7zUY_Kn_Sr2lug', + ANOMALY_EXPLORER: '1FAIpQLSfF1Ry561b4lYrY7iiyXhuZpxFzAmy2c9BFUT3J2AJUevY1iw', +}; + +const MATCHED_CREATED_BY_TAGS = ['ml-module-metrics-ui-hosts']; + +export const FeedBackButton: FC = ({ jobIds, page }) => { + const { jobs: getJobs } = useJobsApiService(); + const { + services: { kibanaVersion }, + } = useMlKibana(); + const { isCloud } = useCloudCheck(); + // ML does not have an explicit isServerless flag, + // it does however have individual feature flags which are set depending + // whether the environment is serverless or not. + // showNodeInfo will always be false in a serverless environment + // and true in a non-serverless environment. + const { showNodeInfo } = useEnabledFeatures(); + + const [jobIdsString, setJobIdsString] = useState(null); + const [showButton, setShowButton] = useState(false); + + const formId = useMemo(() => getFormId(page), [page]); + const isMounted = useMountedState(); + + useEffect(() => { + const tempJobIdsString = jobIds.join(','); + if (tempJobIdsString === jobIdsString || tempJobIdsString === '') { + return; + } + setShowButton(false); + setJobIdsString(tempJobIdsString); + + getJobs(jobIds).then((resp) => { + if (isMounted()) { + setShowButton( + resp.some((job) => MATCHED_CREATED_BY_TAGS.includes(job.custom_settings?.created_by)) + ); + } + }); + }, [jobIds, getJobs, jobIdsString, isMounted]); + + if (showButton === false || formId === null) { + return null; + } + + return ( + + ); +}; + +function getFormId(page: MlPages) { + switch (page) { + case ML_PAGES.SINGLE_METRIC_VIEWER: + return FORM_IDS.SINGLE_METRIC_VIEWER; + case ML_PAGES.ANOMALY_EXPLORER: + return FORM_IDS.ANOMALY_EXPLORER; + default: + return null; + } +} + +function getFormUrl(formId: string) { + return `https://docs.google.com/forms/d/e/${formId}/viewform?usp=pp_url`; +} diff --git a/x-pack/plugins/ml/public/application/components/feedback_button/index.ts b/x-pack/plugins/ml/public/application/components/feedback_button/index.ts new file mode 100644 index 0000000000000..00eb71bf09e5e --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/feedback_button/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 { FeedBackButton } from './feedback_button'; diff --git a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx index fa2808638cbf5..6bf9febf338f7 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx @@ -20,6 +20,7 @@ import { useUrlState } from '@kbn/ml-url-state'; import './_index.scss'; import { useStorage } from '@kbn/ml-local-storage'; +import { ML_PAGES } from '../../../locator'; import { Dictionary } from '../../../../common/types/common'; import { IdBadges } from './id_badges'; import { @@ -29,6 +30,7 @@ import { } from './job_selector_flyout'; import { MlJobWithTimeRange } from '../../../../common/types/anomaly_detection_jobs'; import { ML_APPLY_TIME_RANGE_CONFIG } from '../../../../common/types/storage'; +import { FeedBackButton } from '../feedback_button'; interface GroupObj { groupId: string; @@ -183,6 +185,15 @@ export function JobSelector({ dateFormatTz, singleSelection, timeseriesOnly }: J })} + + + + + + diff --git a/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.test.ts b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.test.ts new file mode 100644 index 0000000000000..4387dbc06e641 --- /dev/null +++ b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.test.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 { mixKqlWithTags } from './mix_kql_with_tags'; + +describe('mixKqlWithTags', () => { + it('mixes kql with selected tags', async () => { + const query = 'something'; + const tags = { + included: ['production'], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and slo.tags: (production)'); + }); + + it('mixes kql with cleared out tags', async () => { + const query = 'something'; + const tags = { + included: [], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something'); + }); + + it('mixes kql with included and excluded tags', async () => { + const query = 'something'; + const tags = { + included: ['production'], + excluded: ['dev'], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and slo.tags: (production) and not slo.tags: (dev)'); + }); + + it('mixes empty query with tags', async () => { + const query = ''; + const tags = { + included: ['production'], + excluded: ['dev'], + }; + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('slo.tags: (production) and not slo.tags: (dev)'); + }); + + it('mixes empty query with empty tags', async () => { + const query = ''; + const tags = { + included: [], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe(''); + }); + + it('mixes empty query with undefined tags', async () => { + const query = ''; + const tags = { + included: undefined, + excluded: undefined, + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe(''); + }); + + it('mixes query with multiple included tags', async () => { + const query = 'something'; + const tags = { + included: ['production', 'staging'], + excluded: [], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and slo.tags: (production or staging)'); + }); + + it('mixes query with multiple excluded tags', async () => { + const query = 'something'; + const tags = { + included: [], + excluded: ['dev', 'production'], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe('something and not slo.tags: (dev or production)'); + }); + + it('mixes query with multiple included and multiple excluded tags', async () => { + const query = 'something'; + const tags = { + included: ['production', 'staging'], + excluded: ['dev', 'pre', 'qa'], + }; + + const kqlQueryMixedValue = mixKqlWithTags(query, tags); + expect(kqlQueryMixedValue).toBe( + 'something and slo.tags: (production or staging) and not slo.tags: (dev or pre or qa)' + ); + }); +}); diff --git a/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.ts b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.ts new file mode 100644 index 0000000000000..70c193edfc38b --- /dev/null +++ b/x-pack/plugins/observability/public/hooks/slo/mix_kql_with_tags.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SearchState } from '../../pages/slos/hooks/use_url_search_state'; + +export function mixKqlWithTags(kqlQuery: string, tags: SearchState['tags']) { + if (!tags) { + return kqlQuery; + } + const includedKqlTags = tags?.included?.join(' or '); + const excludedKqlTags = tags?.excluded?.join(' or '); + + const queryParts = []; + if (!!kqlQuery) { + queryParts.push(kqlQuery); + } + if (!!includedKqlTags) { + queryParts.push(`slo.tags: (${includedKqlTags})`); + } + if (!!excludedKqlTags) { + queryParts.push(`not slo.tags: (${excludedKqlTags})`); + } + return queryParts.join(' and '); +} diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts index dcead3e31615f..ec0f078836c9e 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts @@ -19,6 +19,7 @@ import { import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; +import { mixKqlWithTags } from './mix_kql_with_tags'; interface SLOListParams { kqlQuery?: string; @@ -130,28 +131,3 @@ export function useFetchSloList({ isError, }; } - -const mixKqlWithTags = (kqlQuery: string, tags: SearchState['tags']) => { - if (!tags) { - return kqlQuery; - } - const tagsKqlIncluded = tags.included?.join(' or ') || ''; - const excludedTagsKql = tags.excluded?.join(' or ') || ''; - - let tagsQuery = ''; - if (tagsKqlIncluded && excludedTagsKql) { - tagsQuery = `slo.tags: (${excludedTagsKql}) and not slo.tags: (${tagsKqlIncluded})`; - } - if (!excludedTagsKql && tagsKqlIncluded) { - tagsQuery = `slo.tags: (${tagsKqlIncluded})`; - } - if (!tagsKqlIncluded && excludedTagsKql) { - tagsQuery = `not slo.tags: (${excludedTagsKql})`; - } - - if (!kqlQuery) { - return tagsQuery; - } - - return `${kqlQuery} and ${tagsQuery}`; -}; diff --git a/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts b/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts index 3a3b5d91871ea..1cf3cb1c0a002 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_get_preview_data.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { GetPreviewDataResponse, Indicator } from '@kbn/slo-schema'; +import { GetPreviewDataResponse, Indicator, Objective } from '@kbn/slo-schema'; import { useQuery } from '@tanstack/react-query'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; @@ -21,7 +21,9 @@ export interface UseGetPreviewData { export function useGetPreviewData( isValid: boolean, indicator: Indicator, - range: { start: number; end: number } + range: { start: number; end: number }, + objective?: Objective, + filter?: string ): UseGetPreviewData { const { http } = useKibana().services; @@ -31,7 +33,11 @@ export function useGetPreviewData( const response = await http.post( '/internal/observability/slos/_preview', { - body: JSON.stringify({ indicator, range }), + body: JSON.stringify({ + indicator: { ...indicator, params: { ...indicator.params, filter } }, + range, + ...((objective && { objective }) || {}), + }), signal, } ); diff --git a/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx b/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx index e6ef115b6aba8..ffa4f08e2d144 100644 --- a/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx @@ -5,30 +5,30 @@ * 2.0. */ -import React, { Fragment } from 'react'; -import { useParams } from 'react-router-dom'; -import { Chance } from 'chance'; -import { waitFor } from '@testing-library/react'; import { casesPluginMock } from '@kbn/cases-plugin/public/mocks'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import * as useUiSettingHook from '@kbn/kibana-react-plugin/public/ui_settings/use_ui_setting'; -import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; -import { ruleTypeRegistryMock } from '@kbn/triggers-actions-ui-plugin/public/application/rule_type_registry.mock'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { RuleTypeModel, ValidationResult } from '@kbn/triggers-actions-ui-plugin/public'; - +import { ruleTypeRegistryMock } from '@kbn/triggers-actions-ui-plugin/public/application/rule_type_registry.mock'; +import { waitFor } from '@testing-library/react'; +import { Chance } from 'chance'; +import React, { Fragment } from 'react'; +import { useLocation, useParams } from 'react-router-dom'; +import { useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; +import { ConfigSchema } from '../../plugin'; import { Subset } from '../../typings'; -import { render } from '../../utils/test_helper'; import { useKibana } from '../../utils/kibana_react'; import { kibanaStartMock } from '../../utils/kibana_react.mock'; -import { useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; +import { render } from '../../utils/test_helper'; import { AlertDetails } from './alert_details'; -import { ConfigSchema } from '../../plugin'; import { alertDetail, alertWithNoData } from './mock/alert'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useParams: jest.fn(), + useLocation: jest.fn(), })); jest.mock('../../utils/kibana_react'); @@ -83,6 +83,7 @@ jest.mock('@kbn/observability-shared-plugin/public'); const useFetchAlertDetailMock = useFetchAlertDetail as jest.Mock; const useParamsMock = useParams as jest.Mock; +const useLocationMock = useLocation as jest.Mock; const useBreadcrumbsMock = useBreadcrumbs as jest.Mock; const chance = new Chance(); @@ -108,6 +109,7 @@ describe('Alert details', () => { beforeEach(() => { jest.clearAllMocks(); useParamsMock.mockReturnValue(params); + useLocationMock.mockReturnValue({ pathname: '/alerts/uuid', search: '', state: '', hash: '' }); useBreadcrumbsMock.mockReturnValue([]); ruleTypeRegistry.list.mockReturnValue([ruleType]); ruleTypeRegistry.get.mockReturnValue(ruleType); diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx index 38d5ae3a05852..caf12f5bd6ea4 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts.test.tsx @@ -5,27 +5,31 @@ * 2.0. */ -import React from 'react'; -import { render, waitFor } from '@testing-library/react'; -import { CoreStart } from '@kbn/core/public'; -import { AppMountParameters } from '@kbn/core/public'; -import { TimeBuckets } from '@kbn/data-plugin/common'; +import { ThemeProvider } from '@emotion/react'; +import { MAINTENANCE_WINDOW_FEATURE_ID } from '@kbn/alerting-plugin/common/maintenance_window'; import { fetchActiveMaintenanceWindows } from '@kbn/alerts-ui-shared/src/maintenance_window_callout/api'; import { RUNNING_MAINTENANCE_WINDOW_1 } from '@kbn/alerts-ui-shared/src/maintenance_window_callout/mock'; -import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; +import { TimeBuckets } from '@kbn/data-plugin/common'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; -import { MAINTENANCE_WINDOW_FEATURE_ID } from '@kbn/alerting-plugin/common/maintenance_window'; import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; - -import { ObservabilityPublicPluginsStart } from '../../plugin'; -import { AlertsPage } from './alerts'; -import { kibanaStartMock } from '../../utils/kibana_react.mock'; -import * as pluginContext from '../../hooks/use_plugin_context'; -import * as dataContext from '../../hooks/use_has_data'; -import { createObservabilityRuleTypeRegistryMock } from '../../rules/observability_rule_type_registry_mock'; -import { ThemeProvider } from '@emotion/react'; +import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { euiDarkVars } from '@kbn/ui-theme'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { render, waitFor } from '@testing-library/react'; +import React from 'react'; +import { useLocation } from 'react-router-dom'; +import * as dataContext from '../../hooks/use_has_data'; +import * as pluginContext from '../../hooks/use_plugin_context'; +import { ObservabilityPublicPluginsStart } from '../../plugin'; +import { createObservabilityRuleTypeRegistryMock } from '../../rules/observability_rule_type_registry_mock'; +import { kibanaStartMock } from '../../utils/kibana_react.mock'; +import { AlertsPage } from './alerts'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useLocation: jest.fn(), +})); const mockUseKibanaReturnValue = kibanaStartMock.startContract(); mockUseKibanaReturnValue.services.application.capabilities = { @@ -49,6 +53,8 @@ jest.mock('../../utils/kibana_react', () => ({ })), })); +const useLocationMock = useLocation as jest.Mock; + jest.mock('@kbn/kibana-react-plugin/public', () => ({ __esModule: true, useKibana: jest.fn(() => mockUseKibanaReturnValue), @@ -167,6 +173,7 @@ describe('AlertsPage with all capabilities', () => { beforeEach(() => { fetchActiveMaintenanceWindowsMock.mockClear(); useTimeBuckets.mockReturnValue(timeBuckets); + useLocationMock.mockReturnValue({ pathname: '/alerts', search: '', state: '', hash: '' }); }); it('should render an alerts page template', async () => { diff --git a/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx index be167785e2bad..7a21eb1d2248c 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx @@ -8,10 +8,11 @@ import { EuiHeaderLink, EuiHeaderLinks } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; - -import { useKibana } from '../../../../utils/kibana_react'; +import { useLocation } from 'react-router-dom'; import { usePluginContext } from '../../../../hooks/use_plugin_context'; +import { useKibana } from '../../../../utils/kibana_react'; import HeaderMenuPortal from './header_menu_portal'; + const SLO_FEEDBACK_LINK = 'https://ela.st/slo-feedback'; export function HeaderMenu(): React.ReactElement | null { @@ -25,19 +26,26 @@ export function HeaderMenu(): React.ReactElement | null { appMountParameters: { setHeaderActionMenu }, } = usePluginContext(); + const { pathname } = useLocation(); + const path = pathname?.split('/').slice(1)[0] ?? ''; + const isSloRelatedPath = path === 'slos'; + return ( - - {i18n.translate('xpack.observability.slo.giveFeedback', { - defaultMessage: 'Give feedback', - })} - + {isSloRelatedPath ? ( + + {i18n.translate('xpack.observability.slo.giveFeedback', { + defaultMessage: 'Give feedback', + })} + + ) : null} ({ + ...jest.requireActual('react-router-dom'), + useLocation: jest.fn(), +})); + jest.mock('../../utils/kibana_react', () => ({ __esModule: true, useKibana: jest.fn(() => ({ @@ -39,6 +44,8 @@ jest.mock('@kbn/triggers-actions-ui-plugin/public', () => ({ useLoadRuleTypesQuery: jest.fn(), })); +const useLocationMock = useLocation as jest.Mock; + jest.spyOn(pluginContext, 'usePluginContext').mockImplementation(() => ({ appMountParameters: { setHeaderActionMenu: () => {}, @@ -63,6 +70,10 @@ jest.spyOn(pluginContext, 'usePluginContext').mockImplementation(() => ({ const { useLoadRuleTypesQuery } = jest.requireMock('@kbn/triggers-actions-ui-plugin/public'); describe('RulesPage with all capabilities', () => { + beforeEach(() => { + useLocationMock.mockReturnValue({ pathname: '/rules', search: '', state: '', hash: '' }); + }); + async function setup() { const ruleTypeIndex = new Map( Object.entries({ diff --git a/x-pack/plugins/observability/public/pages/rules/rules.tsx b/x-pack/plugins/observability/public/pages/rules/rules.tsx index 47c3d2d568dda..1b8d20d580d30 100644 --- a/x-pack/plugins/observability/public/pages/rules/rules.tsx +++ b/x-pack/plugins/observability/public/pages/rules/rules.tsx @@ -5,21 +5,20 @@ * 2.0. */ -import React, { lazy, useState } from 'react'; -import { useHistory } from 'react-router-dom'; -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiButtonEmpty } from '@elastic/eui'; +import { EuiButton, EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { ALERTS_FEATURE_ID } from '@kbn/alerting-plugin/common'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ALERTS_FEATURE_ID } from '@kbn/alerting-plugin/common'; import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; - import { AlertConsumers } from '@kbn/rule-data-utils'; import { useLoadRuleTypesQuery } from '@kbn/triggers-actions-ui-plugin/public'; +import React, { lazy, useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { observabilityRuleCreationValidConsumers } from '../../../common/constants'; import { RULES_LOGS_PATH, RULES_PATH } from '../../../common/locators/paths'; -import { useKibana } from '../../utils/kibana_react'; -import { usePluginContext } from '../../hooks/use_plugin_context'; import { useGetFilteredRuleTypes } from '../../hooks/use_get_filtered_rule_types'; -import { observabilityRuleCreationValidConsumers } from '../../../common/constants'; +import { usePluginContext } from '../../hooks/use_plugin_context'; +import { useKibana } from '../../utils/kibana_react'; import { HeaderMenu } from '../overview/components/header_menu/header_menu'; import { RulesTab } from './rules_tab'; diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx index fdb911c80c206..2cca59fad87af 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx @@ -6,10 +6,14 @@ */ import { + AnnotationDomainType, + AreaSeries, Axis, BarSeries, Chart, + LineAnnotation, Position, + RectAnnotation, ScaleType, Settings, Tooltip, @@ -28,11 +32,13 @@ import { import numeral from '@elastic/numeral'; import { useActiveCursor } from '@kbn/charts-plugin/public'; import { i18n } from '@kbn/i18n'; -import { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; import moment from 'moment'; import React, { useRef } from 'react'; +import { max, min } from 'lodash'; import { useGetPreviewData } from '../../../hooks/slo/use_get_preview_data'; import { useKibana } from '../../../utils/kibana_react'; +import { COMPARATOR_MAPPING } from '../../slo_edit/constants'; export interface Props { slo: SLOWithSummaryResponse; @@ -45,7 +51,8 @@ export interface Props { export function EventsChartPanel({ slo, range }: Props) { const { charts, uiSettings } = useKibana().services; const { euiTheme } = useEuiTheme(); - const { isLoading, data } = useGetPreviewData(true, slo.indicator, range); + const filter = slo.instanceId !== ALL_VALUE ? `${slo.groupBy}: "${slo.instanceId}"` : ''; + const { isLoading, data } = useGetPreviewData(true, slo.indicator, range, slo.objective, filter); const baseTheme = charts.theme.useChartsBaseTheme(); const chartRef = useRef(null); const handleCursorUpdate = useActiveCursor(charts.activeCursor, chartRef, { @@ -54,19 +61,87 @@ export function EventsChartPanel({ slo, range }: Props) { const dateFormat = uiSettings.get('dateFormat'); + const title = + slo.indicator.type !== 'sli.metric.timeslice' ? ( + +

+ {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.title', { + defaultMessage: 'Good vs bad events', + })} +

+
+ ) : ( + +

+ {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.timesliceTitle', { + defaultMessage: 'Timeslice metric', + })} +

+
+ ); + const threshold = + slo.indicator.type === 'sli.metric.timeslice' + ? slo.indicator.params.metric.threshold + : undefined; + const yAxisNumberFormat = slo.indicator.type === 'sli.metric.timeslice' ? '0,0[.00]' : '0,0'; + + const values = (data || []).map((row) => { + if (slo.indicator.type === 'sli.metric.timeslice') { + return row.sliValue; + } else { + return row?.events?.total || 0; + } + }); + const maxValue = max(values); + const minValue = min(values); + const domain = { + fit: true, + min: + threshold != null && minValue != null && threshold < minValue ? threshold : minValue || NaN, + max: + threshold != null && maxValue != null && threshold > maxValue ? threshold : maxValue || NaN, + }; + + const annotation = + slo.indicator.type === 'sli.metric.timeslice' && threshold ? ( + <> + {threshold}} + markerPosition="right" + /> + + + ) : null; + return ( - - -

- {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.title', { - defaultMessage: 'Good vs bad events', - })} -

-
-
+ {title} {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.duration', { @@ -84,7 +159,7 @@ export function EventsChartPanel({ slo, range }: Props) { + {annotation} numeral(d).format('0,0')} + tickFormat={(d) => numeral(d).format(yAxisNumberFormat)} + domain={domain} /> - ({ - key: new Date(datum.date).getTime(), - value: datum.events?.good, - })) ?? [] - } - /> + {slo.indicator.type !== 'sli.metric.timeslice' ? ( + <> + ({ + key: new Date(datum.date).getTime(), + value: datum.events?.good, + })) ?? [] + } + /> - ({ - key: new Date(datum.date).getTime(), - value: datum.events?.bad, - })) ?? [] - } - /> + ({ + key: new Date(datum.date).getTime(), + value: datum.events?.bad, + })) ?? [] + } + /> + + ) : ( + ({ + date: new Date(datum.date).getTime(), + value: datum.sliValue >= 0 ? datum.sliValue : null, + }))} + /> + )} )} diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx index 122ecd0c07aac..9de1d11a6849f 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/components/slo_details.tsx @@ -160,11 +160,9 @@ export function SloDetails({ slo, isAutoRefreshing }: Props) { slo={slo} /> - {slo.indicator.type !== 'sli.metric.timeslice' ? ( - - - - ) : null} + + +
diff --git a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx index 22691aaa2b49c..9d0837bd6fc69 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx @@ -5,37 +5,35 @@ * 2.0. */ -import React from 'react'; -import { fireEvent, screen, waitFor } from '@testing-library/react'; +import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import type { Capabilities } from '@kbn/core/public'; import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; - -import { useKibana } from '../../utils/kibana_react'; -import { useParams, useLocation } from 'react-router-dom'; -import { useLicense } from '../../hooks/use_license'; -import { useCapabilities } from '../../hooks/slo/use_capabilities'; -import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; -import { useFetchHistoricalSummary } from '../../hooks/slo/use_fetch_historical_summary'; -import { useFetchActiveAlerts } from '../../hooks/slo/use_fetch_active_alerts'; -import { ActiveAlerts } from '../../hooks/slo/active_alerts'; -import { useDeleteSlo } from '../../hooks/slo/use_delete_slo'; -import { render } from '../../utils/test_helper'; -import { SloDetailsPage } from './slo_details'; -import { buildSlo } from '../../data/slo/slo'; +import { encode } from '@kbn/rison'; +import { ALL_VALUE } from '@kbn/slo-schema'; +import { fireEvent, screen, waitFor } from '@testing-library/react'; +import React from 'react'; +import Router from 'react-router-dom'; import { paths } from '../../../common/locators/paths'; import { HEALTHY_STEP_DOWN_ROLLING_SLO, historicalSummaryData, } from '../../data/slo/historical_summary_data'; -import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { buildApmAvailabilityIndicator } from '../../data/slo/indicator'; -import { ALL_VALUE } from '@kbn/slo-schema'; -import { encode } from '@kbn/rison'; +import { buildSlo } from '../../data/slo/slo'; +import { ActiveAlerts } from '../../hooks/slo/active_alerts'; +import { useCapabilities } from '../../hooks/slo/use_capabilities'; +import { useDeleteSlo } from '../../hooks/slo/use_delete_slo'; +import { useFetchActiveAlerts } from '../../hooks/slo/use_fetch_active_alerts'; +import { useFetchHistoricalSummary } from '../../hooks/slo/use_fetch_historical_summary'; +import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; +import { useLicense } from '../../hooks/use_license'; +import { useKibana } from '../../utils/kibana_react'; +import { render } from '../../utils/test_helper'; +import { SloDetailsPage } from './slo_details'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useParams: jest.fn(), - useLocation: jest.fn(), })); jest.mock('@kbn/observability-shared-plugin/public'); @@ -48,8 +46,7 @@ jest.mock('../../hooks/slo/use_fetch_historical_summary'); jest.mock('../../hooks/slo/use_delete_slo'); const useKibanaMock = useKibana as jest.Mock; -const useParamsMock = useParams as jest.Mock; -const useLocationMock = useLocation as jest.Mock; + const useLicenseMock = useLicense as jest.Mock; const useCapabilitiesMock = useCapabilities as jest.Mock; const useFetchActiveAlertsMock = useFetchActiveAlerts as jest.Mock; @@ -120,13 +117,15 @@ describe('SLO Details Page', () => { }); useFetchActiveAlertsMock.mockReturnValue({ isLoading: false, data: new ActiveAlerts() }); useDeleteSloMock.mockReturnValue({ mutate: mockDelete }); - useLocationMock.mockReturnValue({ search: '' }); + jest + .spyOn(Router, 'useLocation') + .mockReturnValue({ pathname: '/slos/1234', search: '', state: '', hash: '' }); }); describe('when the incorrect license is found', () => { it('navigates to the SLO List page', async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => false }); @@ -137,7 +136,7 @@ describe('SLO Details Page', () => { }); it('renders the PageNotFound when the SLO cannot be found', async () => { - useParamsMock.mockReturnValue('nonexistent'); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: 'nonexistent' }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: undefined }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -148,7 +147,7 @@ describe('SLO Details Page', () => { it('renders the loading spinner when fetching the SLO', async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: true, data: undefined }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -161,7 +160,7 @@ describe('SLO Details Page', () => { it('renders the SLO details page with loading charts when summary data is loading', async () => { const slo = buildSlo({ id: HEALTHY_STEP_DOWN_ROLLING_SLO }); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); useFetchHistoricalSummaryMock.mockReturnValue({ @@ -180,7 +179,7 @@ describe('SLO Details Page', () => { it('renders the SLO details page with the overview and chart panels', async () => { const slo = buildSlo({ id: HEALTHY_STEP_DOWN_ROLLING_SLO }); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -196,7 +195,7 @@ describe('SLO Details Page', () => { it("renders a 'Edit' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -208,7 +207,7 @@ describe('SLO Details Page', () => { it("renders a 'Create alert rule' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -220,7 +219,7 @@ describe('SLO Details Page', () => { it("renders a 'Manage rules' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -232,7 +231,7 @@ describe('SLO Details Page', () => { it("renders a 'Clone' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -257,7 +256,7 @@ describe('SLO Details Page', () => { it("renders a 'Delete' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -287,7 +286,7 @@ describe('SLO Details Page', () => { it('renders the Overview tab by default', async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); useFetchActiveAlertsMock.mockReturnValue({ @@ -306,7 +305,7 @@ describe('SLO Details Page', () => { describe('when an APM SLO is loaded', () => { it("renders a 'Explore in APM' button under actions menu", async () => { const slo = buildSlo({ indicator: buildApmAvailabilityIndicator() }); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); @@ -320,7 +319,7 @@ describe('SLO Details Page', () => { describe('when an Custom KQL SLO is loaded', () => { it("does not render a 'Explore in APM' button under actions menu", async () => { const slo = buildSlo(); - useParamsMock.mockReturnValue(slo.id); + jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: slo.id }); useFetchSloDetailsMock.mockReturnValue({ isLoading: false, data: slo }); useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx index 8fd1039c0c53c..fc805118d6f3a 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx @@ -48,6 +48,7 @@ interface DataPreviewChartProps { thresholdDirection?: 'above' | 'below'; thresholdColor?: string; thresholdMessage?: string; + ignoreMoreThan100?: boolean; } const ONE_HOUR_IN_MILLISECONDS = 1 * 60 * 60 * 1000; @@ -58,6 +59,7 @@ export function DataPreviewChart({ thresholdDirection, thresholdColor, thresholdMessage, + ignoreMoreThan100, }: DataPreviewChartProps) { const { watch, getFieldState, formState, getValues } = useFormContext(); const { charts, uiSettings } = useKibana().services; @@ -80,7 +82,7 @@ export function DataPreviewChart({ isError, } = useDebouncedGetPreviewData(isIndicatorSectionValid, watch('indicator'), range); - const isMoreThan100 = previewData?.find((row) => row.sliValue > 1) != null; + const isMoreThan100 = !ignoreMoreThan100 && previewData?.find((row) => row.sliValue > 1) != null; const baseTheme = charts.theme.useChartsBaseTheme(); const dateFormat = uiSettings.get('dateFormat'); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx index 1c01219ffe1a2..acc6344f732ad 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx @@ -179,6 +179,7 @@ export function TimesliceMetricIndicatorTypeForm() { thresholdDirection={['GT', 'GTE'].includes(comparator) ? 'above' : 'below'} thresholdColor={euiTheme.colors.warning} thresholdMessage={`${COMPARATOR_MAPPING[comparator]} ${threshold}`} + ignoreMoreThan100 />
diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx index 20b2c89287a3c..fc1a3cef31d5a 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx @@ -5,12 +5,14 @@ * 2.0. */ -import { fireEvent, waitFor, cleanup } from '@testing-library/react'; +import { ILicense } from '@kbn/licensing-plugin/common/types'; +import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; +import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; +import { cleanup, fireEvent, waitFor } from '@testing-library/react'; import { createBrowserHistory } from 'history'; import React from 'react'; import Router from 'react-router-dom'; -import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; - +import { BehaviorSubject } from 'rxjs'; import { paths } from '../../../common/locators/paths'; import { buildSlo } from '../../data/slo/slo'; import { useCapabilities } from '../../hooks/slo/use_capabilities'; @@ -26,9 +28,6 @@ import { kibanaStartMock } from '../../utils/kibana_react.mock'; import { render } from '../../utils/test_helper'; import { SLO_EDIT_FORM_DEFAULT_VALUES } from './constants'; import { SloEditPage } from './slo_edit'; -import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; -import { BehaviorSubject } from 'rxjs'; -import { ILicense } from '@kbn/licensing-plugin/common/types'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -197,7 +196,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '1234' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: undefined }); @@ -220,7 +219,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '1234' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: undefined }); @@ -251,7 +250,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '1234' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: undefined }); @@ -270,7 +269,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: undefined }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/1234/edit', search: '', state: '', hash: '' }); const { queryByTestId } = render(); @@ -295,7 +294,7 @@ describe('SLO Edit Page', () => { ); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/create', search: '', state: '', hash: '' }); useFetchApmSuggestionsMock.mockReturnValue({ suggestions: ['cartService'], @@ -327,7 +326,7 @@ describe('SLO Edit Page', () => { jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123Foo/edit', search: '', state: '', hash: '' }); const { queryByTestId } = render(); @@ -373,7 +372,7 @@ describe('SLO Edit Page', () => { ); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); @@ -410,7 +409,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); @@ -432,7 +431,7 @@ describe('SLO Edit Page', () => { jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); jest .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); + .mockReturnValue({ pathname: '/slos/123/edit', search: '', state: '', hash: '' }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); @@ -456,9 +455,12 @@ describe('SLO Edit Page', () => { const slo = buildSlo(); jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); - jest - .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: 'create-rule=true', state: '', hash: '' }); + jest.spyOn(Router, 'useLocation').mockReturnValue({ + pathname: '/slos/123/edit', + search: 'create-rule=true', + state: '', + hash: '', + }); useFetchSloMock.mockReturnValue({ isLoading: false, data: slo }); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx index 052ef26cd758b..f14f1d7a1446e 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx @@ -11,7 +11,6 @@ import { i18n } from '@kbn/i18n'; import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { createHtmlPortalNode, OutPortal } from 'react-reverse-portal'; -import { FeedbackButton } from '../alert_details/components/feedback_button'; import { paths } from '../../../common/locators/paths'; import { useKibana } from '../../utils/kibana_react'; import { usePluginContext } from '../../hooks/use_plugin_context'; @@ -79,7 +78,7 @@ export function SloEditPage() { : i18n.translate('xpack.observability.sloCreatePageTitle', { defaultMessage: 'Create new SLO', }), - rightSideItems: [, ], + rightSideItems: [], bottomBorder: false, }} data-test-subj="slosEditPage" diff --git a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx index ca09a51af1464..a785be9f9a81a 100644 --- a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx @@ -5,12 +5,13 @@ * 2.0. */ -import { act, fireEvent, screen, waitFor } from '@testing-library/react'; -import React from 'react'; -import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; - +import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; +import { encode } from '@kbn/rison'; +import { act, fireEvent, screen, waitFor } from '@testing-library/react'; +import React from 'react'; +import Router from 'react-router-dom'; import { paths } from '../../../common/locators/paths'; import { historicalSummaryData } from '../../data/slo/historical_summary_data'; import { emptySloList, sloList } from '../../data/slo/slo'; @@ -23,7 +24,6 @@ import { useLicense } from '../../hooks/use_license'; import { useKibana } from '../../utils/kibana_react'; import { render } from '../../utils/test_helper'; import { SlosPage } from './slos'; -import { encode } from '@kbn/rison'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -127,6 +127,9 @@ describe('SLOs Page', () => { jest.clearAllMocks(); mockKibana(); useCapabilitiesMock.mockReturnValue({ hasWriteCapabilities: true, hasReadCapabilities: true }); + jest + .spyOn(Router, 'useLocation') + .mockReturnValue({ pathname: '/slos', search: '', state: '', hash: '' }); }); describe('when the incorrect license is found', () => { diff --git a/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx index 8290ecc2988be..f967b6cb40c69 100644 --- a/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx @@ -5,19 +5,24 @@ * 2.0. */ -import React from 'react'; +import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; import { screen, waitFor } from '@testing-library/react'; - -import { render } from '../../utils/test_helper'; -import { useKibana } from '../../utils/kibana_react'; -import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; +import React from 'react'; +import Router from 'react-router-dom'; +import { paths } from '../../../common/locators/paths'; +import { emptySloList, sloList } from '../../data/slo/slo'; +import { useCapabilities } from '../../hooks/slo/use_capabilities'; import { useFetchSloGlobalDiagnosis } from '../../hooks/slo/use_fetch_global_diagnosis'; +import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; import { useLicense } from '../../hooks/use_license'; +import { useKibana } from '../../utils/kibana_react'; +import { render } from '../../utils/test_helper'; import { SlosWelcomePage } from './slos_welcome'; -import { emptySloList, sloList } from '../../data/slo/slo'; -import { useCapabilities } from '../../hooks/slo/use_capabilities'; -import { paths } from '../../../common/locators/paths'; -import { observabilityAIAssistantPluginMock } from '@kbn/observability-ai-assistant-plugin/public/mock'; + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: jest.fn(), +})); jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../utils/kibana_react'); @@ -56,6 +61,9 @@ describe('SLOs Welcome Page', () => { jest.clearAllMocks(); mockKibana(); useCapabilitiesMock.mockReturnValue({ hasWriteCapabilities: true, hasReadCapabilities: true }); + jest + .spyOn(Router, 'useLocation') + .mockReturnValue({ pathname: '/slos/welcome', search: '', state: '', hash: '' }); }); describe('when the incorrect license is found', () => { diff --git a/x-pack/plugins/observability/server/index.ts b/x-pack/plugins/observability/server/index.ts index 3d9e87ccadf00..682d05e2f249f 100644 --- a/x-pack/plugins/observability/server/index.ts +++ b/x-pack/plugins/observability/server/index.ts @@ -19,7 +19,7 @@ import { WrappedElasticsearchClientError, } from '../common/utils/unwrap_es_response'; -export { rangeQuery, kqlQuery, termQuery, termsQuery } from './utils/queries'; +export { rangeQuery, kqlQuery, termQuery, termsQuery, wildcardQuery } from './utils/queries'; export { getParsedFilterQuery } from './utils/get_parsed_filtered_query'; export { getInspectResponse } from '../common/utils/get_inspect_response'; diff --git a/x-pack/plugins/observability/server/services/slo/get_preview_data.ts b/x-pack/plugins/observability/server/services/slo/get_preview_data.ts index c1cd4d0d6caf1..0aa7ffbf94119 100644 --- a/x-pack/plugins/observability/server/services/slo/get_preview_data.ts +++ b/x-pack/plugins/observability/server/services/slo/get_preview_data.ts @@ -86,6 +86,10 @@ export class GetPreviewData { date_histogram: { field: '@timestamp', fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { _good: { @@ -172,6 +176,10 @@ export class GetPreviewData { date_histogram: { field: '@timestamp', fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { good: { @@ -233,6 +241,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { ...getHistogramIndicatorAggregations.execute({ @@ -284,6 +296,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { ...getCustomMetricIndicatorAggregation.execute({ @@ -337,6 +353,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { ...getCustomMetricIndicatorAggregation.execute('metric'), @@ -376,6 +396,10 @@ export class GetPreviewData { date_histogram: { field: timestampField, fixed_interval: options.interval, + extended_bounds: { + min: options.range.start, + max: options.range.end, + }, }, aggs: { good: { filter: goodQuery }, @@ -402,12 +426,21 @@ export class GetPreviewData { public async execute(params: GetPreviewDataParams): Promise { try { - const bucketSize = Math.max( - calculateAuto - .near(100, moment.duration(params.range.end - params.range.start, 'ms')) - ?.asMinutes() ?? 0, - 1 - ); + // If the time range is 24h or less, then we want to use a 1m bucket for the + // Timeslice metric so that the chart is as close to the evaluation as possible. + // Otherwise due to how the statistics work, the values might not look like + // they've breached the threshold. + const bucketSize = + params.indicator.type === 'sli.metric.timeslice' && + params.range.end - params.range.start <= 86_400_000 && + params.objective?.timesliceWindow + ? params.objective.timesliceWindow.asMinutes() + : Math.max( + calculateAuto + .near(100, moment.duration(params.range.end - params.range.start, 'ms')) + ?.asMinutes() ?? 0, + 1 + ); const options: Options = { range: params.range, interval: `${bucketSize}m`, diff --git a/x-pack/plugins/observability/server/ui_settings.ts b/x-pack/plugins/observability/server/ui_settings.ts index f58b6dd1f9683..0ccd75c9ae3a3 100644 --- a/x-pack/plugins/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability/server/ui_settings.ts @@ -298,8 +298,8 @@ export const uiSettings: Record = { }, }), schema: schema.boolean(), - value: false, - requiresPageReload: false, + value: true, + requiresPageReload: true, type: 'boolean', }, [apmAWSLambdaPriceFactor]: { diff --git a/x-pack/plugins/observability/server/utils/queries.test.ts b/x-pack/plugins/observability/server/utils/queries.test.ts new file mode 100644 index 0000000000000..0e34f84050386 --- /dev/null +++ b/x-pack/plugins/observability/server/utils/queries.test.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 { wildcardQuery } from './queries'; // Replace 'your-module' with the actual module path + +describe('wildcardQuery', () => { + it('generates wildcard query with leading wildcard by default', () => { + const result = wildcardQuery('fieldName', 'value'); + expect(result).toEqual([ + { + wildcard: { + fieldName: { + value: '*value*', + case_insensitive: true, + }, + }, + }, + ]); + }); + + it('generates wildcard query without leading wildcard if specified in options', () => { + const result = wildcardQuery('fieldName', 'value', { leadingWildcard: false }); + expect(result).toEqual([ + { + wildcard: { + fieldName: { + value: 'value*', + case_insensitive: true, + }, + }, + }, + ]); + }); + + it('returns an empty array if value is undefined', () => { + const result = wildcardQuery('fieldName', undefined); + expect(result).toEqual([]); + }); +}); diff --git a/x-pack/plugins/observability/server/utils/queries.ts b/x-pack/plugins/observability/server/utils/queries.ts index 4715e0f398e4a..bdacad577838c 100644 --- a/x-pack/plugins/observability/server/utils/queries.ts +++ b/x-pack/plugins/observability/server/utils/queries.ts @@ -31,6 +31,27 @@ export function termQuery( return [{ term: { [field]: value } }]; } +export function wildcardQuery( + field: T, + value: string | undefined, + opts = { leadingWildcard: true } +): QueryDslQueryContainer[] { + if (isUndefinedOrNull(value)) { + return []; + } + + return [ + { + wildcard: { + [field]: { + value: opts.leadingWildcard ? `*${value}*` : `${value}*`, + case_insensitive: true, + }, + }, + }, + ]; +} + export function termsQuery( field: string, ...values: Array diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts index c4d5edee7d3af..3f85bb560fa6f 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/custom_logs/install_elastic_agent.cy.ts @@ -618,11 +618,11 @@ describe('[Logs onboarding] Custom logs - install elastic agent', () => { .should('exist'); }); - it('when user clicks on Explore Logs it navigates to observability log explorer', () => { + it('when user clicks on Explore Logs it navigates to observability logs explorer', () => { cy.wait('@checkOnboardingProgress'); cy.getByTestSubj('obltOnboardingExploreLogs').should('exist').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.get('[data-test-subj="datasetSelectorPopoverButton"]') .contains('[Mylogs] mylogs', { matchCase: false }) .should('exist'); diff --git a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts index 80d5e042c1239..8b95d171a70ef 100644 --- a/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts +++ b/x-pack/plugins/observability_onboarding/e2e/cypress/e2e/logs/system_logs.cy.ts @@ -673,11 +673,11 @@ describe('[Logs onboarding] System logs', () => { cy.visitKibana('/app/observabilityOnboarding/systemLogs'); }); - it('when users clicks on Explore logs they navigate to log explorer - All logs', () => { + it('when users clicks on Explore logs they navigate to logs explorer - All logs', () => { cy.wait('@systemIntegrationInstall'); cy.getByTestSubj('obltOnboardingExploreLogs').should('exist').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.get('button').contains('All logs').should('exist'); }); }); @@ -692,11 +692,11 @@ describe('[Logs onboarding] System logs', () => { cy.visitKibana('/app/observabilityOnboarding/systemLogs'); }); - it('when users clicks on Explore logs they navigate to log explorer and System integration is selected', () => { + it('when users clicks on Explore logs they navigate to logs explorer and System integration is selected', () => { cy.wait('@systemIntegrationInstall'); cy.getByTestSubj('obltOnboardingExploreLogs').should('exist').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.get('button').contains('[System] syslog').should('exist'); }); }); diff --git a/x-pack/plugins/observability_solution/logs_explorer/README.md b/x-pack/plugins/observability_solution/logs_explorer/README.md index 1a46e08981984..31d1f43498e22 100755 --- a/x-pack/plugins/observability_solution/logs_explorer/README.md +++ b/x-pack/plugins/observability_solution/logs_explorer/README.md @@ -1,10 +1,10 @@ -# Log Explorer +# Logs Explorer -This plugin is home to the `` component and related types. It implements several of the underlying concepts that the [Observability Log Explorer app](../observability_solution/observability_logs_explorer) builds upon. +This plugin is home to the `` component and related types. It implements several of the underlying concepts that the [Observability Logs Explorer app](../observability_solution/observability_logs_explorer) builds upon. ## Developing the `` component -⚠ The Log Explorer is in early stages of development, so the following partly describes the current situation and partly the intended future scenario. +⚠ The Logs Explorer is in early stages of development, so the following partly describes the current situation and partly the intended future scenario. ### Dependencies @@ -20,11 +20,11 @@ While not fully realized yet, the dependency graph would roughly resemble the fo ```mermaid flowchart TD -obs_log_explorer_app(Observability Log Explorer app) +obs_log_explorer_app(Observability Logs Explorer app) obs_apps(Other Observability apps) -obs_log_explorer_component(Observability Log Explorer component) +obs_log_explorer_component(Observability Logs Explorer component) other_apps(Other non-Observability apps) -log_explorer_component(Log Explorer component) +log_explorer_component(Logs Explorer component) platform(Kibana Platform) discover(Discover Main container) fleet(Fleet / EPM) @@ -47,7 +47,7 @@ When designing the API we face two conflicting goals: - It should be easy to consume by any non-observability app. This means... - its API needs to be relatively stable and straightforward. - it should not perform any page-wide changes that could interfere with consuming app's page state (such as URL changes). -- It should be extensible so the Observability Log Explorer can build on top of this. +- It should be extensible so the Observability Logs Explorer can build on top of this. In its current state the `` achieves neither goal. To resolve the tension in the future we could export two variants with different sets of properties. diff --git a/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts b/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts index 62cd9af1d05c3..114ba985553a7 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts +++ b/x-pack/plugins/observability_solution/logs_explorer/common/constants.ts @@ -5,7 +5,7 @@ * 2.0. */ -export const LOG_EXPLORER_PROFILE_ID = 'log-explorer'; +export const LOG_EXPLORER_PROFILE_ID = 'logs-explorer'; // Fields constants export const TIMESTAMP_FIELD = '@timestamp'; diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx index f8c34d5dd8346..b26f90145b6a5 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_header.tsx @@ -54,7 +54,7 @@ export function FlyoutHeader({ doc }: { doc: FlyoutDoc }) { @@ -71,7 +71,7 @@ export function FlyoutHeader({ doc }: { doc: FlyoutDoc }) { const contentField = hasMessageField && ( - + @@ -110,9 +110,9 @@ export function FlyoutHeader({ doc }: { doc: FlyoutDoc }) { buttonContent={accordionTitle} paddingSize="m" initialIsOpen={true} - data-test-subj={`logExplorerFlyoutHeaderSection${flyoutContentLabel}`} + data-test-subj={`logsExplorerFlyoutHeaderSection${flyoutContentLabel}`} > - + {hasMessageField ? contentField : logLevelAndTimestamp} diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx index 6ee16be2fddae..5e8af29566372 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/components/flyout_detail/flyout_highlights.tsx @@ -49,11 +49,11 @@ export function FlyoutHighlights({ {formattedDoc[constants.SERVICE_NAME_FIELD] && ( {formattedDoc[constants.CLOUD_PROVIDER_FIELD] && ( {formattedDoc[constants.LOG_FILE_PATH_FIELD] && ( + {timestamp} ); diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx index 42fd21e89141b..5e485cb03c99b 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/components/virtual_columns/content.tsx @@ -31,9 +31,9 @@ const LogMessage = ({ field, value }: { field?: string; value: string }) => { return ( {renderFieldPrefix && ( - {field} + {field} )} - + {value} @@ -108,7 +108,7 @@ export const Content = ({ fieldFormats={fieldFormats} shouldShowFieldHandler={shouldShowFieldHandler} maxEntries={50} - dataTestSubj="logExplorerCellDescriptionList" + dataTestSubj="logsExplorerCellDescriptionList" className="logsExplorerVirtualColumn__sourceDocument" /> )} diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx index cd74ed1c4c81c..958070c6041a2 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_flyout_content.tsx @@ -46,7 +46,7 @@ const CustomFlyoutContent = ({ <> - {/* Apply custom Log Explorer detail */} + {/* Apply custom Logs Explorer detail */} {renderCustomizedContent(flyoutContentProps)} diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts b/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts index 8cf915b64691c..0beda0992aacf 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts +++ b/x-pack/plugins/observability_solution/logs_explorer/public/utils/get_data_view_test_subj.ts @@ -5,7 +5,7 @@ * 2.0. */ -const BASE_DATA_VIEW_TEST_SUBJ = 'logExplorerDataView'; +const BASE_DATA_VIEW_TEST_SUBJ = 'logsExplorerDataView'; const publicDataViewPatternsSet = new Set(['logs-*', 'logstash-*', 'filebeat-*']); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/README.md b/x-pack/plugins/observability_solution/observability_logs_explorer/README.md index ae3c50138ab46..56328aa2cc08d 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/README.md +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/README.md @@ -1,4 +1,4 @@ -# Observability Log Explorer +# Observability Logs Explorer This plugin provides an app based on the `LogExplorer` component from the `logs_explorer` plugin, but adds observability-specific affordances. @@ -8,17 +8,17 @@ This plugin provides an app based on the `LogExplorer` component from the `logs_ #### FTR Server ``` -yarn test:ftr:server --config ./x-pack/test/functional/apps/observability_log_explorer/config.ts +yarn test:ftr:server --config ./x-pack/test/functional/apps/observability_logs_explorer/config.ts ``` #### FTR Runner ``` -yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_log_explorer/config.ts --include ./x-pack/test/functional/apps/observability_log_explorer/index.ts +yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_logs_explorer/config.ts --include ./x-pack/test/functional/apps/observability_logs_explorer/index.ts ``` #### Running Individual Tests ``` -yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_log_explorer/config.ts --include ./x-pack/test/functional/apps/observability_log_explorer/$1 +yarn test:ftr:runner --config ./x-pack/test/functional/apps/observability_logs_explorer/config.ts --include ./x-pack/test/functional/apps/observability_logs_explorer/$1 ``` ### Serverless @@ -30,20 +30,20 @@ yarn test:ftr:server --config ./x-pack/test_serverless/functional/test_suites/ob #### Runner ``` -yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts ``` #### Running Individual Tests ``` -yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/$1 +yarn test:ftr:runner --config ./x-pack/test_serverless/functional/test_suites/observability/config.ts --include ./x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/$1 ``` ## Checktypes -#### Log Explorer +#### Logs Explorer ``` node scripts/type_check.js --project x-pack/plugins/observability_solution/logs_explorer/tsconfig.json ``` -#### Observability Log Explorer +#### Observability Logs Explorer ``` node scripts/type_check.js --project x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json ``` diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts index f94c83117e7e8..5ef2ca71e5ce1 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/index.ts @@ -10,5 +10,5 @@ export { SingleDatasetLocatorDefinition, AllDatasetsLocatorDefinition, } from './locators'; -export { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from './url_schema'; +export { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from './url_schema'; export { deepCompactObject } from './utils/deep_compact_object'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts index ff12691e8c2fd..0c4615ad110e0 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/locators.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; import { AllDatasetsLocatorParams, SingleDatasetLocatorParams, @@ -36,7 +36,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation({}); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),v:1)', state: {}, }); @@ -51,7 +51,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),time:(from:now-30m,to:now),v:1)', state: {}, }); @@ -68,7 +68,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),query:(language:kuery,query:foo),v:1)', state: {}, }); @@ -86,7 +86,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: '/?pageState=(datasetSelection:(selectionType:all),refreshInterval:(pause:!f,value:666),v:1)', state: {}, }); @@ -101,7 +101,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await allDatasetsLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(columns:!((field:_source)),datasetSelection:(selectionType:all),v:1)`, state: {}, }); @@ -147,7 +147,7 @@ describe('Observability Logs Explorer Locators', () => { }); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),v:1)`, state: {}, }); @@ -164,7 +164,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),time:(from:now-30m,to:now),v:1)`, state: {}, }); @@ -184,7 +184,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),query:(language:kuery,query:foo),v:1)`, state: {}, }); @@ -204,7 +204,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),refreshInterval:(pause:!f,value:666),v:1)`, state: {}, }); @@ -221,7 +221,7 @@ describe('Observability Logs Explorer Locators', () => { const location = await singleDatasetLocator.getLocation(params); expect(location).toMatchObject({ - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path: `/?pageState=(columns:!((field:_source)),datasetSelection:(selection:(dataset:(name:'logs-test-*-*',title:test),name:Test),selectionType:unresolved),v:1)`, state: {}, }); diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts index 664251374d88c..d2464184107f2 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/locators/utils/construct_locator_path.ts @@ -16,8 +16,8 @@ import { availableControlsPanels, DatasetSelectionPlain, } from '@kbn/logs-explorer-plugin/common'; -import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; -import { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from '../../url_schema'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, urlSchemaV1 } from '../../url_schema'; import { deepCompactObject } from '../../utils/deep_compact_object'; type ControlsPageState = NonNullable; @@ -49,14 +49,14 @@ export const constructLocatorPath = async (params: LocatorPathConstructionParams ); const path = setStateToKbnUrl( - OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, + OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, pageState, { useHash, storeInHashQuery: false }, '/' ); return { - app: OBSERVABILITY_LOG_EXPLORER_APP_ID, + app: OBSERVABILITY_LOGS_EXPLORER_APP_ID, path, state: { ...(origin ? { origin } : {}), diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts index fa3b3f72383d1..22b00ded2e180 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/common.ts @@ -5,4 +5,4 @@ * 2.0. */ -export const OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY = 'pageState'; +export const OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY = 'pageState'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts index d8f53e47b6058..f0873d9949426 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/common/url_schema/index.ts @@ -5,5 +5,5 @@ * 2.0. */ -export { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY } from './common'; +export { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY } from './common'; export * as urlSchemaV1 from './url_schema_v1'; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/redirect_to_observability_logs_explorer.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/redirect_to_observability_logs_explorer.tsx new file mode 100644 index 0000000000000..222b68fa8544e --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/applications/redirect_to_observability_logs_explorer.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import { useLocation } from 'react-router-dom'; +import { Router } from '@kbn/shared-ux-router'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; + +export const renderObservabilityLogExplorerRedirect = ( + core: CoreStart, + appParams: AppMountParameters +) => { + ReactDOM.render( + + + , + appParams.element + ); + + return () => { + ReactDOM.unmountComponentAtNode(appParams.element); + }; +}; + +export const ObservabilityLogExplorerRedirect = ({ core }: { core: CoreStart }) => { + const location = useLocation(); + const path = `${location.pathname}${location.search}`; + core.application.navigateToApp(OBSERVABILITY_LOGS_EXPLORER_APP_ID, { replace: true, path }); + return <>; +}; diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx index a9f50468a8db9..755b01f820909 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/discover_link.tsx @@ -74,7 +74,7 @@ export const DiscoverLinkForUnknownState = React.memo(() => ( {discoverLinkTitle} @@ -105,7 +105,7 @@ export const DiscoverLink = React.memo( {...discoverLinkProps} color="primary" iconType="discoverApp" - data-test-subj="logExplorerDiscoverFallbackLink" + data-test-subj="logsExplorerDiscoverFallbackLink" > {discoverLinkTitle} diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx index a9e1135cbb099..5bdf9348db5d5 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/log_explorer_top_nav_menu.tsx @@ -40,7 +40,7 @@ const ServerlessTopNav = () => { const { ObservabilityAIAssistantActionMenuItem } = services.observabilityAIAssistant; return ( - + @@ -106,7 +106,7 @@ const StatefulTopNav = () => { chrome.setBreadcrumbsAppendExtension({ content: toMountPoint( { return ( - + diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx index 261405c766024..be7e0722210f5 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/onboarding_link.tsx @@ -48,7 +48,7 @@ export const OnboardingLink = React.memo(({ urlService }: { urlService: BrowserU fill size="s" iconType="indexOpen" - data-test-subj="logExplorerOnboardingLink" + data-test-subj="logsExplorerOnboardingLink" > {onboardingLinkTitle} diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts index 6af6484e883b5..4c00dd88525d6 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/plugin.ts @@ -6,6 +6,7 @@ */ import { + AppMountParameters, AppNavLinkStatus, CoreSetup, CoreStart, @@ -13,7 +14,7 @@ import { Plugin, PluginInitializerContext, } from '@kbn/core/public'; -import { OBSERVABILITY_LOG_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; +import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability'; import { AllDatasetsLocatorDefinition, ObservabilityLogExplorerLocators, @@ -28,7 +29,6 @@ import type { ObservabilityLogExplorerSetupDeps, ObservabilityLogExplorerStartDeps, } from './types'; - export class ObservabilityLogExplorerPlugin implements Plugin { @@ -47,7 +47,7 @@ export class ObservabilityLogExplorerPlugin const useHash = core.uiSettings.get('state:storeInSessionStorage'); core.application.register({ - id: OBSERVABILITY_LOG_EXPLORER_APP_ID, + id: OBSERVABILITY_LOGS_EXPLORER_APP_ID, title: logExplorerAppTitle, category: DEFAULT_APP_CATEGORIES.observability, euiIconType: 'logoLogging', @@ -71,6 +71,21 @@ export class ObservabilityLogExplorerPlugin }, }); + // App used solely to redirect from "/app/observability-log-explorer" to "/app/observability-logs-explorer" + core.application.register({ + id: 'observability-log-explorer', + title: logExplorerAppTitle, + navLinkStatus: AppNavLinkStatus.hidden, + mount: async (appMountParams: AppMountParameters) => { + const [coreStart] = await core.getStartServices(); + const { renderObservabilityLogExplorerRedirect } = await import( + './applications/redirect_to_observability_logs_explorer' + ); + + return renderObservabilityLogExplorerRedirect(coreStart, appMountParams); + }, + }); + if (serverless) { discover.showLogExplorerTabs(); } diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx index e8b93562915c4..120c33f4e11a8 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/routes/main/main_route.tsx @@ -83,7 +83,7 @@ const InitializingContent = React.memo(() => ( title={ } /> diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts index 2eef22e0e5269..cdb2ec2980439 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_log_explorer/src/url_state_storage_service.ts @@ -11,7 +11,7 @@ import { IKbnUrlStateStorage, withNotifyOnErrors } from '@kbn/kibana-utils-plugi import * as Either from 'fp-ts/lib/Either'; import * as rt from 'io-ts'; import { InvokeCreator } from 'xstate'; -import { OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY } from '../../../../common'; +import { OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY } from '../../../../common'; import type { ObservabilityLogExplorerContext, ObservabilityLogExplorerEvent } from './types'; import * as urlSchemaV1 from './url_schema_v1'; @@ -32,7 +32,7 @@ export const updateUrlFromLogExplorerState = context.logExplorerState ); - urlStateStorageContainer.set(OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, encodedUrlStateValues, { + urlStateStorageContainer.set(OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, encodedUrlStateValues, { replace: true, }); }; @@ -48,7 +48,7 @@ export const initializeFromUrl = (_context, _event) => (send) => { const urlStateValues = - urlStateStorageContainer.get(OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY) ?? undefined; + urlStateStorageContainer.get(OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY) ?? undefined; // in the future we'll have to more schema versions to the union const stateValuesE = rt diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx index 9de71eb8069d7..184b99bb87368 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/utils/breadcrumbs.tsx @@ -9,7 +9,7 @@ import { EuiBreadcrumb } from '@elastic/eui'; import type { ChromeStart } from '@kbn/core-chrome-browser'; import { LOGS_APP_ID, - OBSERVABILITY_LOG_EXPLORER_APP_ID, + OBSERVABILITY_LOGS_EXPLORER_APP_ID, OBSERVABILITY_OVERVIEW_APP_ID, } from '@kbn/deeplinks-observability'; import { useLinkProps } from '@kbn/observability-shared-plugin/public'; @@ -28,7 +28,7 @@ export const useBreadcrumbs = ( ) => { const observabilityLinkProps = useLinkProps({ app: OBSERVABILITY_OVERVIEW_APP_ID }); const logsLinkProps = useLinkProps({ app: LOGS_APP_ID }); - const logExplorerLinkProps = useLinkProps({ app: OBSERVABILITY_LOG_EXPLORER_APP_ID }); + const logExplorerLinkProps = useLinkProps({ app: OBSERVABILITY_LOGS_EXPLORER_APP_ID }); useEffect(() => { setBreadcrumbs( diff --git a/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts b/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts index c2c94bb5afd0e..59a5ad3d8cf61 100644 --- a/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/tiers/endpoint_essentials.cy.ts @@ -7,7 +7,8 @@ import { checkOsqueryResponseActionsPermissions } from '../../tasks/response_actions'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/174567 +describe.skip( 'App Features for Endpoint Essentials PLI', { tags: ['@serverless'], diff --git a/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx b/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx index cbc773abfc0f7..e32f514ff5ac5 100644 --- a/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx +++ b/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx @@ -43,7 +43,7 @@ export class EmbeddableSearchBar extends Embeddable< `} > { diff --git a/x-pack/plugins/security/common/constants.ts b/x-pack/plugins/security/common/constants.ts index 48a0202105965..aab0c9d6c438b 100644 --- a/x-pack/plugins/security/common/constants.ts +++ b/x-pack/plugins/security/common/constants.ts @@ -92,3 +92,8 @@ export const SESSION_EXTENSION_THROTTLE_MS = 60 * 1000; * Route to get session info and extend session expiration */ export const SESSION_ROUTE = '/internal/security/session'; + +/** + * Allowed image file types for uploading an image as avatar + */ +export const IMAGE_FILE_TYPES = ['image/svg+xml', 'image/jpeg', 'image/png', 'image/gif']; diff --git a/x-pack/plugins/security/common/model/api_key.ts b/x-pack/plugins/security/common/model/api_key.ts index 3441f4d07a8c1..48fe1dd95e85d 100644 --- a/x-pack/plugins/security/common/model/api_key.ts +++ b/x-pack/plugins/security/common/model/api_key.ts @@ -22,7 +22,7 @@ export interface RestApiKey extends BaseApiKey { } /** - * Interface representing a Cross-Cluster API key the way it is returned by Elasticsearch GET endpoint. + * Interface representing a cross-cluster API key the way it is returned by Elasticsearch GET endpoint. * * TODO: Remove this type when `@elastic/elasticsearch` has been updated. */ diff --git a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx index 04ac8cc4fcfe9..601e13c8bb16e 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx +++ b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx @@ -42,8 +42,9 @@ import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import type { DarkModeValue, UserProfileData } from '@kbn/user-profile-components'; import { UserAvatar, useUpdateUserProfile } from '@kbn/user-profile-components'; -import { createImageHandler, getRandomColor, IMAGE_FILE_TYPES, VALID_HEX_COLOR } from './utils'; +import { createImageHandler, getRandomColor, VALID_HEX_COLOR } from './utils'; import type { AuthenticatedUser } from '../../../common'; +import { IMAGE_FILE_TYPES } from '../../../common/constants'; import { canUserChangeDetails, canUserChangePassword, diff --git a/x-pack/plugins/security/public/account_management/user_profile/utils.ts b/x-pack/plugins/security/public/account_management/user_profile/utils.ts index fd15350288493..2621ba0b65f1f 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/utils.ts +++ b/x-pack/plugins/security/public/account_management/user_profile/utils.ts @@ -4,8 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { IMAGE_FILE_TYPES } from '../../../common/constants'; -export const IMAGE_FILE_TYPES = ['image/svg+xml', 'image/jpeg', 'image/png', 'image/gif']; export const MAX_IMAGE_SIZE = 64; export function readFile(data: File) { diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx index fb7ba2b6c40a3..65a2f588a7591 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_key_flyout.tsx @@ -282,7 +282,7 @@ export const ApiKeyFlyout: FunctionComponent = ({ title={ } /> @@ -295,7 +295,7 @@ export const ApiKeyFlyout: FunctionComponent = ({ title={ } /> @@ -451,7 +451,7 @@ export const ApiKeyFlyout: FunctionComponent = ({

@@ -477,7 +477,7 @@ export const ApiKeyFlyout: FunctionComponent = ({

@@ -485,7 +485,7 @@ export const ApiKeyFlyout: FunctionComponent = ({ diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx index dd47e7e198bc4..834c4d4fd6054 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx @@ -159,7 +159,7 @@ export const APIKeysGridPage: FunctionComponent = () => { description={ } rightSideItems={ @@ -353,12 +353,9 @@ export const ApiKeysTable: FunctionComponent = ({ }, { field: 'type', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.typeColumnName', { + defaultMessage: 'Type', + }), sortable: true, render: (type: CategorizedApiKey['type']) => , } @@ -367,12 +364,9 @@ export const ApiKeysTable: FunctionComponent = ({ if (canManageApiKeys || usernameFilters.length > 1) { columns.push({ field: 'username', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.ownerColumnName', { + defaultMessage: 'Owner', + }), sortable: true, render: (username: CategorizedApiKey['username']) => , }); @@ -381,12 +375,9 @@ export const ApiKeysTable: FunctionComponent = ({ columns.push( { field: 'creation', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.createdColumnName', { + defaultMessage: 'Created', + }), sortable: true, mobileOptions: { show: false, @@ -406,12 +397,9 @@ export const ApiKeysTable: FunctionComponent = ({ }, { field: 'expiration', - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.statusColumnName', { + defaultMessage: 'Status', + }), sortable: true, render: (expiration: number) => , } @@ -422,12 +410,9 @@ export const ApiKeysTable: FunctionComponent = ({ width: `${24 + 2 * 8}px`, actions: [ { - name: ( - - ), + name: i18n.translate('xpack.security.management.apiKeys.table.deleteAction', { + defaultMessage: 'Delete', + }), description: i18n.translate('xpack.security.management.apiKeys.table.deleteDescription', { defaultMessage: 'Delete this API key', }), @@ -571,7 +556,7 @@ export const TypesFilterButton: FunctionComponent = ({ > ) : null} @@ -593,7 +578,7 @@ export const TypesFilterButton: FunctionComponent = ({ > ) : null} @@ -786,7 +771,7 @@ export const ApiKeyBadge: FunctionComponent = ({ type }) => { @@ -818,7 +803,7 @@ export const ApiKeyBadge: FunctionComponent = ({ type }) => { diff --git a/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx b/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx index b5905ec147960..ed733ac8d24b9 100644 --- a/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx @@ -74,7 +74,6 @@ export class RoleMappingsGridPage extends Component { readOnly: false, }; - private tableRef: React.RefObject>; constructor(props: any) { super(props); this.state = { @@ -85,7 +84,6 @@ export class RoleMappingsGridPage extends Component { selectedItems: [], error: undefined, }; - this.tableRef = React.createRef(); } public componentDidMount() { @@ -226,6 +224,7 @@ export class RoleMappingsGridPage extends Component { selectedItems: newSelectedItems, }); }, + selected: selectedItems, }; const search = { @@ -237,13 +236,7 @@ export class RoleMappingsGridPage extends Component { {(deleteRoleMappingsPrompt) => { return ( - deleteRoleMappingsPrompt( - selectedItems, - this.onRoleMappingsDeleted, - this.onRoleMappingsDeleteCancel - ) - } + onClick={() => deleteRoleMappingsPrompt(selectedItems, this.onRoleMappingsDeleted)} color="danger" data-test-subj="bulkDeleteActionButton" > @@ -298,7 +291,6 @@ export class RoleMappingsGridPage extends Component { loading={loadState === 'loadingTable'} message={message} isSelectable={true} - ref={this.tableRef} rowProps={() => { return { 'data-test-subj': 'roleMappingRow', @@ -499,10 +491,6 @@ export class RoleMappingsGridPage extends Component { } }; - private onRoleMappingsDeleteCancel = () => { - this.tableRef.current?.setSelection([]); - }; - private async checkPrivileges() { try { const { canManageRoleMappings, hasCompatibleRealms } = diff --git a/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx b/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx index 6a6433038d635..1da786c7e6b70 100644 --- a/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx +++ b/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx @@ -68,7 +68,6 @@ export class RolesGridPage extends Component { readOnly: false, }; - private tableRef: React.RefObject>; constructor(props: Props) { super(props); this.state = { @@ -80,7 +79,6 @@ export class RolesGridPage extends Component { permissionDenied: false, includeReservedRoles: true, }; - this.tableRef = React.createRef(); } public componentDidMount() { @@ -156,6 +154,7 @@ export class RolesGridPage extends Component { selectableMessage: (selectable: boolean) => !selectable ? 'Role is reserved' : '', onSelectionChange: (selection: Role[]) => this.setState({ selection }), + selected: this.state.selection, } } pagination={{ @@ -188,7 +187,6 @@ export class RolesGridPage extends Component { direction: 'asc', }, }} - ref={this.tableRef} rowProps={(role: Role) => { return { 'data-test-subj': `roleRow`, @@ -484,7 +482,6 @@ export class RolesGridPage extends Component { ); } private onCancelDelete = () => { - this.setState({ showDeleteConfirmation: false, selection: [] }); - this.tableRef.current?.setSelection([]); + this.setState({ showDeleteConfirmation: false }); }; } diff --git a/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts b/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts index 0d8f5a78c64b8..7c63ace9fc706 100644 --- a/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts +++ b/x-pack/plugins/security/server/authentication/api_keys/api_keys.test.ts @@ -259,7 +259,7 @@ describe('API Keys', () => { }); }); - it('creates Cross-Cluster API key when type is `cross_cluster`', async () => { + it('creates cross-cluster API key when type is `cross_cluster`', async () => { mockLicense.isEnabled.mockReturnValue(true); mockScopedClusterClient.asCurrentUser.transport.request.mockResolvedValueOnce({ @@ -388,7 +388,7 @@ describe('API Keys', () => { }); }); - it('updates Cross-Cluster API key when type is `cross_cluster`', async () => { + it('updates cross-cluster API key when type is `cross_cluster`', async () => { mockLicense.isEnabled.mockReturnValue(true); mockScopedClusterClient.asCurrentUser.transport.request.mockResolvedValueOnce({ diff --git a/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts b/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts index 36a3bfeee4f7c..1fbd99b4dd812 100644 --- a/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts +++ b/x-pack/plugins/security/server/authentication/api_keys/api_keys.ts @@ -113,7 +113,7 @@ export class APIKeys implements APIKeysType { } /** - * Determines if Cross-Cluster API Keys are enabled in Elasticsearch. + * Determines if cross-cluster API Keys are enabled in Elasticsearch. */ async areCrossClusterAPIKeysEnabled(): Promise { if (!this.license.isEnabled()) { @@ -123,14 +123,14 @@ export class APIKeys implements APIKeysType { const id = 'kibana-api-key-service-test'; this.logger.debug( - `Testing if Cross-Cluster API Keys are enabled by attempting to update a non-existant key: ${id}` + `Testing if cross-cluster API Keys are enabled by attempting to update a non-existant key: ${id}` ); try { await this.clusterClient.asInternalUser.transport.request({ method: 'PUT', path: `/_security/cross_cluster/api_key/${id}`, - body: {}, // We are sending an empty request body and expect a validation error if Update Cross-Cluster API key endpoint is available. + body: {}, // We are sending an empty request body and expect a validation error if Update cross-cluster API key endpoint is available. }); return false; } catch (error) { @@ -143,7 +143,7 @@ export class APIKeys implements APIKeysType { * * Returns newly created API key or `null` if API keys are disabled. * - * User needs `manage_api_key` privilege to create REST API keys and `manage_security` for Cross-Cluster API keys. + * User needs `manage_api_key` privilege to create REST API keys and `manage_security` for cross-cluster API keys. * * @param request Request instance. * @param createParams The params to create an API key @@ -199,7 +199,7 @@ export class APIKeys implements APIKeysType { * * Returns `updated`, `true` if the update was successful, `false` if there was nothing to update * - * User needs `manage_api_key` privilege to update REST API keys and `manage_security` for Cross-Cluster API keys. + * User needs `manage_api_key` privilege to update REST API keys and `manage_security` for cross-cluster API keys. * * @param request Request instance. * @param updateParams The params to edit an API key diff --git a/x-pack/plugins/security/server/routes/api_keys/get.ts b/x-pack/plugins/security/server/routes/api_keys/get.ts index 7f4154f49868b..4a6583d585ea0 100644 --- a/x-pack/plugins/security/server/routes/api_keys/get.ts +++ b/x-pack/plugins/security/server/routes/api_keys/get.ts @@ -77,7 +77,7 @@ export function defineGetApiKeysRoutes({ return response.ok({ body: { - // @ts-expect-error Elasticsearch client types do not know about Cross-Cluster API keys yet. + // @ts-expect-error Elasticsearch client types do not know about cross-cluster API keys yet. apiKeys: validKeys, canManageCrossClusterApiKeys: clusterPrivileges.manage_security && areCrossClusterApiKeysEnabled, diff --git a/x-pack/plugins/security/server/routes/user_profile/update.ts b/x-pack/plugins/security/server/routes/user_profile/update.ts index 205f6a6d68a4a..9a550ada52adc 100644 --- a/x-pack/plugins/security/server/routes/user_profile/update.ts +++ b/x-pack/plugins/security/server/routes/user_profile/update.ts @@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema'; import type { RouteDefinitionParams } from '..'; +import { IMAGE_FILE_TYPES } from '../../../common/constants'; import { wrapIntoCustomErrorResponse } from '../../errors'; import { flattenObject } from '../../lib'; import { getPrintableSessionId } from '../../session_management'; @@ -47,7 +48,28 @@ export function defineUpdateUserProfileDataRoute({ } const currentUser = getAuthenticationService().getCurrentUser(request); + const userProfileData = request.body; + const imageDataUrl = userProfileData.avatar?.imageUrl; + if (imageDataUrl && typeof imageDataUrl === 'string') { + const matches = imageDataUrl.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/); + if (!matches || matches.length !== 3) { + return response.customError({ + body: 'Unsupported media type', + statusCode: 415, + }); + } + + const [, mimeType] = matches; + + if (!IMAGE_FILE_TYPES.includes(mimeType)) { + return response.customError({ + body: 'Unsupported media type', + statusCode: 415, + }); + } + } + const keysToUpdate = Object.keys(flattenObject(userProfileData)); if (currentUser?.elastic_cloud_user) { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/common/alerts_ecs_fields.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/alerts_ecs_fields.ts new file mode 100644 index 0000000000000..027adaa8ff0c9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/alerts_ecs_fields.ts @@ -0,0 +1,926 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * A list of ECS fields that can appear on the `logs-endpoint.events.*` index. + * Used to defined Event Filters and Endpoint Exceptions + */ +export const ENDPOINT_EVENTS_LOG_INDEX_FIELDS: readonly string[] = [ + '@timestamp', + 'Effective_process.entity_id', + 'Effective_process.executable', + 'Effective_process.name', + 'Effective_process.pid', + 'Persistence.args', + 'Persistence.executable', + 'Persistence.keepalive', + 'Persistence.name', + 'Persistence.path', + 'Persistence.runatload', + 'Target.process.Ext.memory_region.allocation_base', + 'Target.process.Ext.memory_region.allocation_protection', + 'Target.process.Ext.memory_region.allocation_size', + 'Target.process.Ext.memory_region.allocation_type', + 'Target.process.Ext.memory_region.bytes_address', + 'Target.process.Ext.memory_region.bytes_allocation_offset', + 'Target.process.Ext.memory_region.bytes_compressed', + 'Target.process.Ext.memory_region.bytes_compressed_present', + 'Target.process.Ext.memory_region.hash.sha256', + 'Target.process.Ext.memory_region.malware_signature.all_names', + 'Target.process.Ext.memory_region.malware_signature.identifier', + 'Target.process.Ext.memory_region.malware_signature.primary.matches', + 'Target.process.Ext.memory_region.malware_signature.primary.signature.hash.sha256', + 'Target.process.Ext.memory_region.malware_signature.primary.signature.id', + 'Target.process.Ext.memory_region.malware_signature.primary.signature.name', + 'Target.process.Ext.memory_region.malware_signature.version', + 'Target.process.Ext.memory_region.mapped_path', + 'Target.process.Ext.memory_region.mapped_pe.Ext.dotnet', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.md5', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha1', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha256', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha384', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha512', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.ssdeep', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.hash.tlsh', + 'Target.process.Ext.memory_region.mapped_pe.Ext.sections.name', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.md5', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha1', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha256', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha384', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha512', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.ssdeep', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.hash.tlsh', + 'Target.process.Ext.memory_region.mapped_pe.Ext.streams.name', + 'Target.process.Ext.memory_region.mapped_pe.architecture', + 'Target.process.Ext.memory_region.mapped_pe.company', + 'Target.process.Ext.memory_region.mapped_pe.description', + 'Target.process.Ext.memory_region.mapped_pe.file_version', + 'Target.process.Ext.memory_region.mapped_pe.go_import_hash', + 'Target.process.Ext.memory_region.mapped_pe.go_imports', + 'Target.process.Ext.memory_region.mapped_pe.go_imports_names_entropy', + 'Target.process.Ext.memory_region.mapped_pe.go_imports_names_var_entropy', + 'Target.process.Ext.memory_region.mapped_pe.go_stripped', + 'Target.process.Ext.memory_region.mapped_pe.imphash', + 'Target.process.Ext.memory_region.mapped_pe.import_hash', + 'Target.process.Ext.memory_region.mapped_pe.imports', + 'Target.process.Ext.memory_region.mapped_pe.imports_names_entropy', + 'Target.process.Ext.memory_region.mapped_pe.imports_names_var_entropy', + 'Target.process.Ext.memory_region.mapped_pe.original_file_name', + 'Target.process.Ext.memory_region.mapped_pe.pehash', + 'Target.process.Ext.memory_region.mapped_pe.product', + 'Target.process.Ext.memory_region.mapped_pe.sections.entropy', + 'Target.process.Ext.memory_region.mapped_pe.sections.name', + 'Target.process.Ext.memory_region.mapped_pe.sections.physical_size', + 'Target.process.Ext.memory_region.mapped_pe.sections.var_entropy', + 'Target.process.Ext.memory_region.mapped_pe.sections.virtual_size', + 'Target.process.Ext.memory_region.mapped_pe_detected', + 'Target.process.Ext.memory_region.memory_pe.Ext.dotnet', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.md5', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha1', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha256', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha384', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.sha512', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.ssdeep', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.hash.tlsh', + 'Target.process.Ext.memory_region.memory_pe.Ext.sections.name', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.md5', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha1', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha256', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha384', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.sha512', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.ssdeep', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.hash.tlsh', + 'Target.process.Ext.memory_region.memory_pe.Ext.streams.name', + 'Target.process.Ext.memory_region.memory_pe.architecture', + 'Target.process.Ext.memory_region.memory_pe.company', + 'Target.process.Ext.memory_region.memory_pe.description', + 'Target.process.Ext.memory_region.memory_pe.file_version', + 'Target.process.Ext.memory_region.memory_pe.go_import_hash', + 'Target.process.Ext.memory_region.memory_pe.go_imports', + 'Target.process.Ext.memory_region.memory_pe.go_imports_names_entropy', + 'Target.process.Ext.memory_region.memory_pe.go_imports_names_var_entropy', + 'Target.process.Ext.memory_region.memory_pe.go_stripped', + 'Target.process.Ext.memory_region.memory_pe.imphash', + 'Target.process.Ext.memory_region.memory_pe.import_hash', + 'Target.process.Ext.memory_region.memory_pe.imports', + 'Target.process.Ext.memory_region.memory_pe.imports_names_entropy', + 'Target.process.Ext.memory_region.memory_pe.imports_names_var_entropy', + 'Target.process.Ext.memory_region.memory_pe.original_file_name', + 'Target.process.Ext.memory_region.memory_pe.pehash', + 'Target.process.Ext.memory_region.memory_pe.product', + 'Target.process.Ext.memory_region.memory_pe.sections.entropy', + 'Target.process.Ext.memory_region.memory_pe.sections.name', + 'Target.process.Ext.memory_region.memory_pe.sections.physical_size', + 'Target.process.Ext.memory_region.memory_pe.sections.var_entropy', + 'Target.process.Ext.memory_region.memory_pe.sections.virtual_size', + 'Target.process.Ext.memory_region.memory_pe_detected', + 'Target.process.Ext.memory_region.region_base', + 'Target.process.Ext.memory_region.region_protection', + 'Target.process.Ext.memory_region.region_size', + 'Target.process.Ext.memory_region.region_state', + 'Target.process.Ext.memory_region.strings', + 'Target.process.Ext.token.integrity_level_name', + 'Target.process.entity_id', + 'Target.process.executable', + 'Target.process.executable.caseless', + 'Target.process.executable.text', + 'Target.process.name', + 'Target.process.name.caseless', + 'Target.process.name.text', + 'Target.process.pid', + '_id', + '_index', + '_score', + '_source', + 'agent.ephemeral_id', + 'agent.id', + 'agent.name', + 'agent.type', + 'agent.version', + 'cloud.account.id', + 'cloud.instance.name', + 'cloud.project.id', + 'cloud.provider', + 'cloud.region', + 'container.id', + 'container.image.hash.all', + 'container.image.name', + 'container.image.tag', + 'container.name', + 'data_stream.dataset', + 'data_stream.namespace', + 'data_stream.type', + 'destination.address', + 'destination.as.number', + 'destination.as.organization.name', + 'destination.as.organization.name.text', + 'destination.bytes', + 'destination.domain', + 'destination.geo.city_name', + 'destination.geo.continent_code', + 'destination.geo.continent_name', + 'destination.geo.country_iso_code', + 'destination.geo.country_name', + 'destination.geo.location', + 'destination.geo.name', + 'destination.geo.postal_code', + 'destination.geo.region_iso_code', + 'destination.geo.region_name', + 'destination.geo.timezone', + 'destination.ip', + 'destination.packets', + 'destination.port', + 'destination.registered_domain', + 'destination.top_level_domain', + 'dll.Ext.code_signature.exists', + 'dll.Ext.code_signature.status', + 'dll.Ext.code_signature.subject_name', + 'dll.Ext.code_signature.trusted', + 'dll.Ext.code_signature.valid', + 'dll.Ext.defense_evasions', + 'dll.Ext.device.bus_type', + 'dll.Ext.device.dos_name', + 'dll.Ext.device.file_system_type', + 'dll.Ext.device.nt_name', + 'dll.Ext.device.product_id', + 'dll.Ext.device.serial_number', + 'dll.Ext.device.vendor_id', + 'dll.Ext.device.volume_device_type', + 'dll.Ext.load_index', + 'dll.Ext.relative_file_creation_time', + 'dll.Ext.relative_file_name_modify_time', + 'dll.Ext.size', + 'dll.code_signature.exists', + 'dll.code_signature.signing_id', + 'dll.code_signature.status', + 'dll.code_signature.subject_name', + 'dll.code_signature.team_id', + 'dll.code_signature.trusted', + 'dll.code_signature.valid', + 'dll.hash.md5', + 'dll.hash.sha1', + 'dll.hash.sha256', + 'dll.hash.sha512', + 'dll.name', + 'dll.path', + 'dll.pe.company', + 'dll.pe.description', + 'dll.pe.file_version', + 'dll.pe.imphash', + 'dll.pe.original_file_name', + 'dll.pe.product', + 'dns.Ext.options', + 'dns.Ext.status', + 'dns.question.name', + 'dns.question.registered_domain', + 'dns.question.subdomain', + 'dns.question.top_level_domain', + 'dns.question.type', + 'dns.resolved_ip', + 'ecs.version', + 'event.Ext.correlation.id', + 'event.action', + 'event.agent_id_status', + 'event.category', + 'event.code', + 'event.created', + 'event.dataset', + 'event.end', + 'event.hash', + 'event.id', + 'event.ingested', + 'event.kind', + 'event.module', + 'event.outcome', + 'event.provider', + 'event.sequence', + 'event.severity', + 'event.start', + 'event.type', + 'file.Ext.code_signature.exists', + 'file.Ext.code_signature.status', + 'file.Ext.code_signature.subject_name', + 'file.Ext.code_signature.trusted', + 'file.Ext.code_signature.valid', + 'file.Ext.device.bus_type', + 'file.Ext.device.dos_name', + 'file.Ext.device.file_system_type', + 'file.Ext.device.nt_name', + 'file.Ext.device.product_id', + 'file.Ext.device.serial_number', + 'file.Ext.device.vendor_id', + 'file.Ext.device.volume_device_type', + 'file.Ext.entropy', + 'file.Ext.header_bytes', + 'file.Ext.header_data', + 'file.Ext.malware_signature.all_names', + 'file.Ext.malware_signature.identifier', + 'file.Ext.malware_signature.primary.signature.hash.sha256', + 'file.Ext.malware_signature.primary.signature.id', + 'file.Ext.malware_signature.primary.signature.name', + 'file.Ext.malware_signature.version', + 'file.Ext.monotonic_id', + 'file.Ext.original.extension', + 'file.Ext.original.gid', + 'file.Ext.original.group', + 'file.Ext.original.mode', + 'file.Ext.original.name', + 'file.Ext.original.owner', + 'file.Ext.original.path', + 'file.Ext.original.uid', + 'file.Ext.windows.zone_identifier', + 'file.accessed', + 'file.attributes', + 'file.code_signature.exists', + 'file.code_signature.signing_id', + 'file.code_signature.status', + 'file.code_signature.subject_name', + 'file.code_signature.team_id', + 'file.code_signature.trusted', + 'file.code_signature.valid', + 'file.created', + 'file.ctime', + 'file.device', + 'file.directory', + 'file.drive_letter', + 'file.extension', + 'file.gid', + 'file.group', + 'file.hash.md5', + 'file.hash.sha1', + 'file.hash.sha256', + 'file.hash.sha512', + 'file.inode', + 'file.mime_type', + 'file.mode', + 'file.mtime', + 'file.name', + 'file.owner', + 'file.path', + 'file.path.caseless', + 'file.path.text', + 'file.pe.company', + 'file.pe.description', + 'file.pe.file_version', + 'file.pe.imphash', + 'file.pe.original_file_name', + 'file.pe.product', + 'file.size', + 'file.target_path', + 'file.target_path.caseless', + 'file.target_path.text', + 'file.type', + 'file.uid', + 'group.Ext.real.id', + 'group.Ext.real.name', + 'group.domain', + 'group.id', + 'group.name', + 'host.architecture', + 'host.boot.id', + 'host.domain', + 'host.hostname', + 'host.id', + 'host.ip', + 'host.mac', + 'host.name', + 'host.os.Ext.variant', + 'host.os.family', + 'host.os.full', + 'host.os.full.caseless', + 'host.os.full.text', + 'host.os.kernel', + 'host.os.name', + 'host.os.name.caseless', + 'host.os.name.text', + 'host.os.platform', + 'host.os.type', + 'host.os.version', + 'host.pid_ns_ino', + 'host.type', + 'host.uptime', + 'http.request.body.bytes', + 'http.request.body.content', + 'http.request.body.content.text', + 'http.request.bytes', + 'http.response.Ext.version', + 'http.response.body.bytes', + 'http.response.body.content', + 'http.response.body.content.text', + 'http.response.bytes', + 'http.response.status_code', + 'message', + 'network.bytes', + 'network.community_id', + 'network.direction', + 'network.iana_number', + 'network.packets', + 'network.protocol', + 'network.transport', + 'network.type', + 'orchestrator.cluster.id', + 'orchestrator.cluster.name', + 'orchestrator.namespace', + 'orchestrator.resource.ip', + 'orchestrator.resource.name', + 'orchestrator.resource.parent.type', + 'orchestrator.resource.type', + 'package.name', + 'process.Ext.ancestry', + 'process.Ext.api.behaviors', + 'process.Ext.api.metadata.background_callcount', + 'process.Ext.api.metadata.ms_since_last_keyevent', + 'process.Ext.api.metadata.procedure_symbol', + 'process.Ext.api.metadata.return_value', + 'process.Ext.api.metadata.start_address_allocation_protection', + 'process.Ext.api.metadata.start_address_module', + 'process.Ext.api.metadata.target_address_name', + 'process.Ext.api.metadata.target_address_path', + 'process.Ext.api.metadata.thread_info_flags', + 'process.Ext.api.metadata.visible_windows_count', + 'process.Ext.api.metadata.windows_count', + 'process.Ext.api.name', + 'process.Ext.api.parameters.address', + 'process.Ext.api.parameters.allocation_type', + 'process.Ext.api.parameters.argument1', + 'process.Ext.api.parameters.argument2', + 'process.Ext.api.parameters.argument3', + 'process.Ext.api.parameters.context_flags', + 'process.Ext.api.parameters.desired_access', + 'process.Ext.api.parameters.desired_access_numeric', + 'process.Ext.api.parameters.device', + 'process.Ext.api.parameters.driver', + 'process.Ext.api.parameters.eax', + 'process.Ext.api.parameters.ebp', + 'process.Ext.api.parameters.ebx', + 'process.Ext.api.parameters.ecx', + 'process.Ext.api.parameters.edi', + 'process.Ext.api.parameters.edx', + 'process.Ext.api.parameters.eip', + 'process.Ext.api.parameters.esi', + 'process.Ext.api.parameters.esp', + 'process.Ext.api.parameters.flags', + 'process.Ext.api.parameters.handle_type', + 'process.Ext.api.parameters.hook_module', + 'process.Ext.api.parameters.hook_type', + 'process.Ext.api.parameters.procedure', + 'process.Ext.api.parameters.protection', + 'process.Ext.api.parameters.protection_old', + 'process.Ext.api.parameters.r8', + 'process.Ext.api.parameters.r9', + 'process.Ext.api.parameters.rax', + 'process.Ext.api.parameters.rbp', + 'process.Ext.api.parameters.rbx', + 'process.Ext.api.parameters.rcx', + 'process.Ext.api.parameters.rdi', + 'process.Ext.api.parameters.rdx', + 'process.Ext.api.parameters.rip', + 'process.Ext.api.parameters.rsi', + 'process.Ext.api.parameters.rsp', + 'process.Ext.api.parameters.size', + 'process.Ext.api.parameters.usage', + 'process.Ext.api.parameters.usage_page', + 'process.Ext.api.summary', + 'process.Ext.architecture', + 'process.Ext.authentication_id', + 'process.Ext.code_signature.exists', + 'process.Ext.code_signature.status', + 'process.Ext.code_signature.subject_name', + 'process.Ext.code_signature.trusted', + 'process.Ext.code_signature.valid', + 'process.Ext.defense_evasions', + 'process.Ext.device.bus_type', + 'process.Ext.device.dos_name', + 'process.Ext.device.file_system_type', + 'process.Ext.device.nt_name', + 'process.Ext.device.product_id', + 'process.Ext.device.serial_number', + 'process.Ext.device.vendor_id', + 'process.Ext.device.volume_device_type', + 'process.Ext.dll.Ext.mapped_address', + 'process.Ext.dll.Ext.mapped_size', + 'process.Ext.dll.name', + 'process.Ext.dll.path', + 'process.Ext.effective_parent.entity_id', + 'process.Ext.effective_parent.executable', + 'process.Ext.effective_parent.name', + 'process.Ext.effective_parent.pid', + 'process.Ext.memory_region.allocation_base', + 'process.Ext.memory_region.allocation_protection', + 'process.Ext.memory_region.allocation_size', + 'process.Ext.memory_region.allocation_type', + 'process.Ext.memory_region.bytes_address', + 'process.Ext.memory_region.bytes_allocation_offset', + 'process.Ext.memory_region.bytes_compressed', + 'process.Ext.memory_region.bytes_compressed_present', + 'process.Ext.memory_region.hash.sha256', + 'process.Ext.memory_region.malware_signature.all_names', + 'process.Ext.memory_region.malware_signature.identifier', + 'process.Ext.memory_region.malware_signature.primary.matches', + 'process.Ext.memory_region.malware_signature.primary.signature.hash.sha256', + 'process.Ext.memory_region.malware_signature.primary.signature.id', + 'process.Ext.memory_region.malware_signature.primary.signature.name', + 'process.Ext.memory_region.malware_signature.version', + 'process.Ext.memory_region.mapped_path', + 'process.Ext.memory_region.mapped_pe.Ext.dotnet', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.md5', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha1', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha256', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha384', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.sha512', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.ssdeep', + 'process.Ext.memory_region.mapped_pe.Ext.sections.hash.tlsh', + 'process.Ext.memory_region.mapped_pe.Ext.sections.name', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.md5', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha1', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha256', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha384', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.sha512', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.ssdeep', + 'process.Ext.memory_region.mapped_pe.Ext.streams.hash.tlsh', + 'process.Ext.memory_region.mapped_pe.Ext.streams.name', + 'process.Ext.memory_region.mapped_pe.architecture', + 'process.Ext.memory_region.mapped_pe.company', + 'process.Ext.memory_region.mapped_pe.description', + 'process.Ext.memory_region.mapped_pe.file_version', + 'process.Ext.memory_region.mapped_pe.go_import_hash', + 'process.Ext.memory_region.mapped_pe.go_imports', + 'process.Ext.memory_region.mapped_pe.go_imports_names_entropy', + 'process.Ext.memory_region.mapped_pe.go_imports_names_var_entropy', + 'process.Ext.memory_region.mapped_pe.go_stripped', + 'process.Ext.memory_region.mapped_pe.imphash', + 'process.Ext.memory_region.mapped_pe.import_hash', + 'process.Ext.memory_region.mapped_pe.imports', + 'process.Ext.memory_region.mapped_pe.imports_names_entropy', + 'process.Ext.memory_region.mapped_pe.imports_names_var_entropy', + 'process.Ext.memory_region.mapped_pe.original_file_name', + 'process.Ext.memory_region.mapped_pe.pehash', + 'process.Ext.memory_region.mapped_pe.product', + 'process.Ext.memory_region.mapped_pe.sections.entropy', + 'process.Ext.memory_region.mapped_pe.sections.name', + 'process.Ext.memory_region.mapped_pe.sections.physical_size', + 'process.Ext.memory_region.mapped_pe.sections.var_entropy', + 'process.Ext.memory_region.mapped_pe.sections.virtual_size', + 'process.Ext.memory_region.mapped_pe_detected', + 'process.Ext.memory_region.memory_pe.Ext.dotnet', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.md5', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha1', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha256', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha384', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.sha512', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.ssdeep', + 'process.Ext.memory_region.memory_pe.Ext.sections.hash.tlsh', + 'process.Ext.memory_region.memory_pe.Ext.sections.name', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.md5', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha1', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha256', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha384', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.sha512', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.ssdeep', + 'process.Ext.memory_region.memory_pe.Ext.streams.hash.tlsh', + 'process.Ext.memory_region.memory_pe.Ext.streams.name', + 'process.Ext.memory_region.memory_pe.architecture', + 'process.Ext.memory_region.memory_pe.company', + 'process.Ext.memory_region.memory_pe.description', + 'process.Ext.memory_region.memory_pe.file_version', + 'process.Ext.memory_region.memory_pe.go_import_hash', + 'process.Ext.memory_region.memory_pe.go_imports', + 'process.Ext.memory_region.memory_pe.go_imports_names_entropy', + 'process.Ext.memory_region.memory_pe.go_imports_names_var_entropy', + 'process.Ext.memory_region.memory_pe.go_stripped', + 'process.Ext.memory_region.memory_pe.imphash', + 'process.Ext.memory_region.memory_pe.import_hash', + 'process.Ext.memory_region.memory_pe.imports', + 'process.Ext.memory_region.memory_pe.imports_names_entropy', + 'process.Ext.memory_region.memory_pe.imports_names_var_entropy', + 'process.Ext.memory_region.memory_pe.original_file_name', + 'process.Ext.memory_region.memory_pe.pehash', + 'process.Ext.memory_region.memory_pe.product', + 'process.Ext.memory_region.memory_pe.sections.entropy', + 'process.Ext.memory_region.memory_pe.sections.name', + 'process.Ext.memory_region.memory_pe.sections.physical_size', + 'process.Ext.memory_region.memory_pe.sections.var_entropy', + 'process.Ext.memory_region.memory_pe.sections.virtual_size', + 'process.Ext.memory_region.memory_pe_detected', + 'process.Ext.memory_region.region_base', + 'process.Ext.memory_region.region_protection', + 'process.Ext.memory_region.region_size', + 'process.Ext.memory_region.region_state', + 'process.Ext.memory_region.strings', + 'process.Ext.mitigation_policies', + 'process.Ext.protection', + 'process.Ext.relative_file_creation_time', + 'process.Ext.relative_file_name_modify_time', + 'process.Ext.session', + 'process.Ext.session_info.authentication_package', + 'process.Ext.session_info.client_address', + 'process.Ext.session_info.id', + 'process.Ext.session_info.logon_type', + 'process.Ext.session_info.relative_logon_time', + 'process.Ext.session_info.relative_password_age', + 'process.Ext.session_info.user_flags', + 'process.Ext.token.elevation', + 'process.Ext.token.elevation_level', + 'process.Ext.token.elevation_type', + 'process.Ext.token.integrity_level_name', + 'process.Ext.token.security_attributes', + 'process.Ext.trusted', + 'process.Ext.trusted_descendant', + 'process.args', + 'process.args_count', + 'process.code_signature.exists', + 'process.code_signature.signing_id', + 'process.code_signature.status', + 'process.code_signature.subject_name', + 'process.code_signature.team_id', + 'process.code_signature.trusted', + 'process.code_signature.valid', + 'process.command_line', + 'process.command_line.caseless', + 'process.command_line.text', + 'process.end', + 'process.entity_id', + 'process.entry_leader.args', + 'process.entry_leader.args_count', + 'process.entry_leader.attested_groups.name', + 'process.entry_leader.attested_user.id', + 'process.entry_leader.attested_user.name', + 'process.entry_leader.attested_user.name.text', + 'process.entry_leader.command_line', + 'process.entry_leader.command_line.caseless', + 'process.entry_leader.command_line.text', + 'process.entry_leader.entity_id', + 'process.entry_leader.entry_meta.source.ip', + 'process.entry_leader.entry_meta.type', + 'process.entry_leader.executable', + 'process.entry_leader.executable.caseless', + 'process.entry_leader.executable.text', + 'process.entry_leader.group.id', + 'process.entry_leader.group.name', + 'process.entry_leader.interactive', + 'process.entry_leader.name', + 'process.entry_leader.name.caseless', + 'process.entry_leader.name.text', + 'process.entry_leader.parent.entity_id', + 'process.entry_leader.parent.pid', + 'process.entry_leader.parent.session_leader.entity_id', + 'process.entry_leader.parent.session_leader.pid', + 'process.entry_leader.parent.session_leader.start', + 'process.entry_leader.parent.start', + 'process.entry_leader.pid', + 'process.entry_leader.real_group.id', + 'process.entry_leader.real_group.name', + 'process.entry_leader.real_user.id', + 'process.entry_leader.real_user.name', + 'process.entry_leader.real_user.name.text', + 'process.entry_leader.same_as_process', + 'process.entry_leader.saved_group.id', + 'process.entry_leader.saved_group.name', + 'process.entry_leader.saved_user.id', + 'process.entry_leader.saved_user.name', + 'process.entry_leader.saved_user.name.text', + 'process.entry_leader.start', + 'process.entry_leader.supplemental_groups.id', + 'process.entry_leader.supplemental_groups.name', + 'process.entry_leader.tty.char_device.major', + 'process.entry_leader.tty.char_device.minor', + 'process.entry_leader.user.id', + 'process.entry_leader.user.name', + 'process.entry_leader.user.name.text', + 'process.entry_leader.working_directory', + 'process.entry_leader.working_directory.caseless', + 'process.entry_leader.working_directory.text', + 'process.env_vars', + 'process.executable', + 'process.executable.caseless', + 'process.executable.text', + 'process.exit_code', + 'process.group.id', + 'process.group.name', + 'process.group_leader.args', + 'process.group_leader.args_count', + 'process.group_leader.command_line', + 'process.group_leader.command_line.caseless', + 'process.group_leader.command_line.text', + 'process.group_leader.entity_id', + 'process.group_leader.executable', + 'process.group_leader.executable.caseless', + 'process.group_leader.executable.text', + 'process.group_leader.group.id', + 'process.group_leader.group.name', + 'process.group_leader.interactive', + 'process.group_leader.name', + 'process.group_leader.name.caseless', + 'process.group_leader.name.text', + 'process.group_leader.pid', + 'process.group_leader.real_group.id', + 'process.group_leader.real_group.name', + 'process.group_leader.real_user.id', + 'process.group_leader.real_user.name', + 'process.group_leader.real_user.name.text', + 'process.group_leader.same_as_process', + 'process.group_leader.saved_group.id', + 'process.group_leader.saved_group.name', + 'process.group_leader.saved_user.id', + 'process.group_leader.saved_user.name', + 'process.group_leader.saved_user.name.text', + 'process.group_leader.start', + 'process.group_leader.supplemental_groups.id', + 'process.group_leader.supplemental_groups.name', + 'process.group_leader.tty.char_device.major', + 'process.group_leader.tty.char_device.minor', + 'process.group_leader.user.id', + 'process.group_leader.user.name', + 'process.group_leader.user.name.text', + 'process.group_leader.working_directory', + 'process.group_leader.working_directory.caseless', + 'process.group_leader.working_directory.text', + 'process.hash.md5', + 'process.hash.sha1', + 'process.hash.sha256', + 'process.hash.sha512', + 'process.interactive', + 'process.io.max_bytes_per_process_exceeded', + 'process.io.text', + 'process.io.total_bytes_captured', + 'process.io.total_bytes_skipped', + 'process.name', + 'process.name.caseless', + 'process.name.text', + 'process.parent.Ext.architecture', + 'process.parent.Ext.code_signature.exists', + 'process.parent.Ext.code_signature.status', + 'process.parent.Ext.code_signature.subject_name', + 'process.parent.Ext.code_signature.trusted', + 'process.parent.Ext.code_signature.valid', + 'process.parent.Ext.protection', + 'process.parent.Ext.real.pid', + 'process.parent.Ext.user', + 'process.parent.args', + 'process.parent.args_count', + 'process.parent.code_signature.exists', + 'process.parent.code_signature.signing_id', + 'process.parent.code_signature.status', + 'process.parent.code_signature.subject_name', + 'process.parent.code_signature.team_id', + 'process.parent.code_signature.trusted', + 'process.parent.code_signature.valid', + 'process.parent.command_line', + 'process.parent.command_line.caseless', + 'process.parent.command_line.text', + 'process.parent.entity_id', + 'process.parent.executable', + 'process.parent.executable.caseless', + 'process.parent.executable.text', + 'process.parent.exit_code', + 'process.parent.group.id', + 'process.parent.group.name', + 'process.parent.group_leader.entity_id', + 'process.parent.group_leader.pid', + 'process.parent.group_leader.start', + 'process.parent.hash.md5', + 'process.parent.hash.sha1', + 'process.parent.hash.sha256', + 'process.parent.hash.sha512', + 'process.parent.interactive', + 'process.parent.name', + 'process.parent.name.caseless', + 'process.parent.name.text', + 'process.parent.pe.company', + 'process.parent.pe.description', + 'process.parent.pe.file_version', + 'process.parent.pe.imphash', + 'process.parent.pe.original_file_name', + 'process.parent.pe.product', + 'process.parent.pgid', + 'process.parent.pid', + 'process.parent.ppid', + 'process.parent.real_group.id', + 'process.parent.real_group.name', + 'process.parent.real_user.id', + 'process.parent.real_user.name', + 'process.parent.real_user.name.text', + 'process.parent.saved_group.id', + 'process.parent.saved_group.name', + 'process.parent.saved_user.id', + 'process.parent.saved_user.name', + 'process.parent.saved_user.name.text', + 'process.parent.start', + 'process.parent.supplemental_groups.id', + 'process.parent.supplemental_groups.name', + 'process.parent.thread.Ext.call_stack.allocation_private_bytes', + 'process.parent.thread.Ext.call_stack.callsite_leading_bytes', + 'process.parent.thread.Ext.call_stack.callsite_trailing_bytes', + 'process.parent.thread.Ext.call_stack.protection', + 'process.parent.thread.Ext.call_stack.symbol_info', + 'process.parent.thread.Ext.call_stack_contains_unbacked', + 'process.parent.thread.Ext.call_stack_summary', + 'process.parent.thread.id', + 'process.parent.thread.name', + 'process.parent.title', + 'process.parent.title.text', + 'process.parent.tty.char_device.major', + 'process.parent.tty.char_device.minor', + 'process.parent.uptime', + 'process.parent.user.id', + 'process.parent.user.name', + 'process.parent.user.name.text', + 'process.parent.working_directory', + 'process.parent.working_directory.caseless', + 'process.parent.working_directory.text', + 'process.pe.company', + 'process.pe.description', + 'process.pe.file_version', + 'process.pe.imphash', + 'process.pe.original_file_name', + 'process.pe.product', + 'process.pgid', + 'process.pid', + 'process.ppid', + 'process.previous.args', + 'process.previous.args_count', + 'process.previous.executable', + 'process.previous.executable.caseless', + 'process.previous.executable.text', + 'process.real_group.id', + 'process.real_group.name', + 'process.real_user.id', + 'process.real_user.name', + 'process.real_user.name.text', + 'process.saved_group.id', + 'process.saved_group.name', + 'process.saved_user.id', + 'process.saved_user.name', + 'process.saved_user.name.text', + 'process.session_leader.args', + 'process.session_leader.args_count', + 'process.session_leader.command_line', + 'process.session_leader.command_line.caseless', + 'process.session_leader.command_line.text', + 'process.session_leader.entity_id', + 'process.session_leader.executable', + 'process.session_leader.executable.caseless', + 'process.session_leader.executable.text', + 'process.session_leader.group.id', + 'process.session_leader.group.name', + 'process.session_leader.interactive', + 'process.session_leader.name', + 'process.session_leader.name.caseless', + 'process.session_leader.name.text', + 'process.session_leader.parent.entity_id', + 'process.session_leader.parent.pid', + 'process.session_leader.parent.session_leader.entity_id', + 'process.session_leader.parent.session_leader.pid', + 'process.session_leader.parent.session_leader.start', + 'process.session_leader.parent.start', + 'process.session_leader.pid', + 'process.session_leader.real_group.id', + 'process.session_leader.real_group.name', + 'process.session_leader.real_user.id', + 'process.session_leader.real_user.name', + 'process.session_leader.real_user.name.text', + 'process.session_leader.same_as_process', + 'process.session_leader.saved_group.id', + 'process.session_leader.saved_group.name', + 'process.session_leader.saved_user.id', + 'process.session_leader.saved_user.name', + 'process.session_leader.saved_user.name.text', + 'process.session_leader.start', + 'process.session_leader.supplemental_groups.id', + 'process.session_leader.supplemental_groups.name', + 'process.session_leader.tty.char_device.major', + 'process.session_leader.tty.char_device.minor', + 'process.session_leader.user.id', + 'process.session_leader.user.name', + 'process.session_leader.user.name.text', + 'process.session_leader.working_directory', + 'process.session_leader.working_directory.caseless', + 'process.session_leader.working_directory.text', + 'process.start', + 'process.supplemental_groups.id', + 'process.supplemental_groups.name', + 'process.thread.Ext.call_stack.allocation_private_bytes', + 'process.thread.Ext.call_stack.callsite_leading_bytes', + 'process.thread.Ext.call_stack.callsite_trailing_bytes', + 'process.thread.Ext.call_stack.instruction_pointer', + 'process.thread.Ext.call_stack.module_path', + 'process.thread.Ext.call_stack.protection', + 'process.thread.Ext.call_stack.protection_provenance', + 'process.thread.Ext.call_stack.symbol_info', + 'process.thread.Ext.call_stack_contains_unbacked', + 'process.thread.Ext.call_stack_final_user_module.code_signature.exists', + 'process.thread.Ext.call_stack_final_user_module.code_signature.status', + 'process.thread.Ext.call_stack_final_user_module.code_signature.subject_name', + 'process.thread.Ext.call_stack_final_user_module.code_signature.trusted', + 'process.thread.Ext.call_stack_final_user_module.code_signature.valid', + 'process.thread.Ext.call_stack_final_user_module.hash.sha256', + 'process.thread.Ext.call_stack_final_user_module.name', + 'process.thread.Ext.call_stack_final_user_module.path', + 'process.thread.Ext.call_stack_final_user_module.protection_provenance', + 'process.thread.Ext.call_stack_summary', + 'process.thread.capabilities.effective', + 'process.thread.capabilities.permitted', + 'process.thread.id', + 'process.thread.name', + 'process.title', + 'process.title.text', + 'process.tty.char_device.major', + 'process.tty.char_device.minor', + 'process.tty.columns', + 'process.tty.rows', + 'process.uptime', + 'process.user.id', + 'process.user.name', + 'process.user.name.text', + 'process.working_directory', + 'process.working_directory.caseless', + 'process.working_directory.text', + 'registry.data.bytes', + 'registry.data.strings', + 'registry.data.type', + 'registry.hive', + 'registry.key', + 'registry.path', + 'registry.value', + 'source.address', + 'source.as.number', + 'source.as.organization.name', + 'source.as.organization.name.text', + 'source.bytes', + 'source.domain', + 'source.geo.city_name', + 'source.geo.continent_code', + 'source.geo.continent_name', + 'source.geo.country_iso_code', + 'source.geo.country_name', + 'source.geo.location', + 'source.geo.name', + 'source.geo.postal_code', + 'source.geo.region_iso_code', + 'source.geo.region_name', + 'source.geo.timezone', + 'source.ip', + 'source.packets', + 'source.port', + 'source.registered_domain', + 'source.top_level_domain', + 'user.Ext.real.id', + 'user.Ext.real.name', + 'user.domain', + 'user.email', + 'user.full_name', + 'user.full_name.text', + 'user.group.Ext.real.id', + 'user.group.Ext.real.name', + 'user.group.domain', + 'user.group.id', + 'user.group.name', + 'user.hash', + 'user.id', + 'user.name', + 'user.name.text', +]; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/common/artifact_list_item_entry_values.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/artifact_list_item_entry_values.ts new file mode 100644 index 0000000000000..bd0321fda8f30 --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/common/artifact_list_item_entry_values.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ListOperator, ListOperatorType } from '@kbn/securitysolution-io-ts-list-types'; +import { ListOperatorEnum, ListOperatorTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; + +export const LIST_ITEM_ENTRY_OPERATOR_TYPES: readonly ListOperatorType[] = Object.freeze([ + ListOperatorTypeEnum.NESTED, + ListOperatorTypeEnum.MATCH, + ListOperatorTypeEnum.MATCH_ANY, + ListOperatorTypeEnum.WILDCARD, + ListOperatorTypeEnum.EXISTS, + ListOperatorTypeEnum.LIST, +]); + +export const LIST_ITEM_ENTRY_OPERATOR: readonly ListOperator[] = Object.freeze([ + ListOperatorEnum.INCLUDED, + ListOperatorEnum.EXCLUDED, +]); diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_exceptions_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_exceptions_generator.ts new file mode 100644 index 0000000000000..99be8d51e195b --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/endpoint_exceptions_generator.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + CreateExceptionListItemSchema, + ExceptionListItemSchema, + ListOperatorType, +} from '@kbn/securitysolution-io-ts-list-types'; +import { ListOperatorTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; +import { ENDPOINT_LIST_ID } from '@kbn/securitysolution-list-constants'; +import { LIST_ITEM_ENTRY_OPERATOR_TYPES } from './common/artifact_list_item_entry_values'; +import { exceptionItemToCreateExceptionItem } from './exceptions_list_item_generator'; +import { BaseDataGenerator } from './base_data_generator'; +import { GLOBAL_ARTIFACT_TAG } from '../service/artifacts'; +import { ENDPOINT_EVENTS_LOG_INDEX_FIELDS } from './common/alerts_ecs_fields'; + +export class EndpointExceptionsGenerator extends BaseDataGenerator { + generate(overrides: Partial = {}): ExceptionListItemSchema { + return { + name: `Generated Exception (${this.randomString(5)})`, + comments: [], + description: 'created by EndpointExceptionsGenerator', + id: this.seededUUIDv4(), + item_id: this.seededUUIDv4(), + list_id: ENDPOINT_LIST_ID, + tags: [GLOBAL_ARTIFACT_TAG], + entries: this.randomEndpointExceptionEntries(1), + meta: undefined, + namespace_type: 'agnostic', + os_types: [this.randomOSFamily()] as ExceptionListItemSchema['os_types'], + created_at: this.randomPastDate(), + created_by: this.randomUser(), + updated_at: '2020-04-20T15:25:31.830Z', + expire_time: undefined, + updated_by: this.randomUser(), + _version: this.randomString(5), + type: 'simple', + tie_breaker_id: this.seededUUIDv4(), + ...overrides, + }; + } + + generateEndpointExceptionForCreate( + overrides: Partial = {} + ): CreateExceptionListItemSchema { + return { + ...exceptionItemToCreateExceptionItem(this.generate()), + ...overrides, + }; + } + + protected randomEndpointExceptionEntries( + count: number = this.randomN(5) + ): ExceptionListItemSchema['entries'] { + const operatorTypes = LIST_ITEM_ENTRY_OPERATOR_TYPES.filter( + (item) => + !( + [ + ListOperatorTypeEnum.LIST, + ListOperatorTypeEnum.NESTED, + ListOperatorTypeEnum.EXISTS, + ] as ListOperatorType[] + ).includes(item) + ); + const fieldList = ENDPOINT_EVENTS_LOG_INDEX_FIELDS.filter((field) => field.endsWith('.text')); + + return Array.from({ length: count || 1 }, () => { + const operatorType = this.randomChoice(operatorTypes); + + return { + field: this.randomChoice(fieldList), + operator: 'included', + type: operatorType, + value: + operatorType === ListOperatorTypeEnum.MATCH_ANY + ? [this.randomString(10), this.randomString(10)] + : this.randomString(10), + }; + }) as ExceptionListItemSchema['entries']; + } +} diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filters_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filters_generator.ts new file mode 100644 index 0000000000000..5b87f282ec3c7 --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/event_filters_generator.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + ExceptionListItemSchema, + CreateExceptionListItemSchema, + ListOperator, +} from '@kbn/securitysolution-io-ts-list-types'; +import { ENDPOINT_ARTIFACT_LISTS } from '@kbn/securitysolution-list-constants'; +import { exceptionItemToCreateExceptionItem } from './exceptions_list_item_generator'; +import { GLOBAL_ARTIFACT_TAG } from '../service/artifacts'; +import { BaseDataGenerator } from './base_data_generator'; +import { ENDPOINT_EVENTS_LOG_INDEX_FIELDS } from './common/alerts_ecs_fields'; + +const ENTRY_OPERATORS: readonly ListOperator[] = ['included', 'excluded']; + +export class EventFiltersGenerator extends BaseDataGenerator { + generate(overrides: Partial = {}): ExceptionListItemSchema { + return { + id: this.seededUUIDv4(), + item_id: this.seededUUIDv4(), + list_id: ENDPOINT_ARTIFACT_LISTS.eventFilters.id, + meta: undefined, + name: `Event filter (${this.randomString(5)})`, + description: `created by ${this.constructor.name}`, + tags: [GLOBAL_ARTIFACT_TAG], + entries: this.randomEventFilterEntries(), + expire_time: undefined, + namespace_type: 'agnostic', + type: 'simple', + os_types: [this.randomOSFamily()] as ExceptionListItemSchema['os_types'], + tie_breaker_id: this.seededUUIDv4(), + _version: this.randomString(5), + comments: [], + created_at: this.randomPastDate(), + created_by: this.randomUser(), + updated_at: '2020-04-20T15:25:31.830Z', + updated_by: this.randomUser(), + ...overrides, + }; + } + + generateEventFilterForCreate( + overrides: Partial = {} + ): CreateExceptionListItemSchema { + return { + ...exceptionItemToCreateExceptionItem(this.generate()), + ...overrides, + }; + } + + protected randomEventFilterEntries( + count: number = this.randomN(5) + ): ExceptionListItemSchema['entries'] { + return Array.from({ length: count || 1 }, () => { + if (this.randomBoolean()) { + // single entry + return { + field: this.randomChoice(ENDPOINT_EVENTS_LOG_INDEX_FIELDS), + operator: this.randomChoice(ENTRY_OPERATORS), + type: 'match', + value: this.randomString(10), + }; + } else { + // nested entry + return { + field: this.randomChoice(ENDPOINT_EVENTS_LOG_INDEX_FIELDS), + type: 'nested', + entries: [ + { + field: this.randomChoice(ENDPOINT_EVENTS_LOG_INDEX_FIELDS), + operator: this.randomChoice(ENTRY_OPERATORS), + type: 'match', + value: this.randomString(10), + }, + ], + }; + } + }); + } +} diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts index a9b2cbd697f4a..cb332f8dea55a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts @@ -39,7 +39,7 @@ type UpdateExceptionListItemSchemaWithNonNullProps = NonNullableTypeProperties< > & Pick; -const exceptionItemToCreateExceptionItem = ( +export const exceptionItemToCreateExceptionItem = ( exceptionItem: ExceptionListItemSchema ): CreateExceptionListItemSchemaWithNonNullProps => { const { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts index 2df3db5b70eeb..806ae7f289f26 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts @@ -247,4 +247,8 @@ export class FleetAgentGenerator extends BaseDataGenerator { public randomAgentStatus() { return this.randomChoice(agentStatusList); } + + public randomString(length: number = 5) { + return super.randomString(length); + } } diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts index fa51e50cb6226..12505dc87a2b0 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts @@ -104,7 +104,7 @@ export const setupFleetForEndpoint = usageTracker.track( export const installOrUpgradeEndpointFleetPackage = usageTracker.track( 'installOrUpgradeEndpointFleetPackage', async (kbnClient: KbnClient, logger: ToolingLog): Promise => { - logger.info(`installOrUpgradeEndpointFleetPackage(): starting`); + logger.debug(`installOrUpgradeEndpointFleetPackage(): starting`); const updatePackages = async () => { const installEndpointPackageResp = (await kbnClient diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts index 0586aca1d0c76..01974b85d6f65 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts @@ -9,6 +9,7 @@ import { mergeWith } from 'lodash'; import type { ToolingLogTextWriterConfig } from '@kbn/tooling-log'; import { ToolingLog } from '@kbn/tooling-log'; import type { Flags } from '@kbn/dev-cli-runner'; +import moment from 'moment/moment'; export const RETRYABLE_TRANSIENT_ERRORS: Readonly> = [ 'no_shard_available_action_exception', @@ -76,18 +77,18 @@ export const retryOnError = async ( const thisAttempt = attempt; attempt++; - log.info(msg(`attempt ${thisAttempt} started at: ${new Date().toISOString()}`)); + log.debug(msg(`attempt ${thisAttempt} started at: ${new Date().toISOString()}`)); try { responsePromise = callback(); // store promise so that if it fails and no more attempts, we return the last failure const result = await responsePromise; - log.info(msg(`attempt ${thisAttempt} was successful. Exiting retry`)); + log.debug(msg(`attempt ${thisAttempt} was successful. Exiting retry`)); log.indent(-4); return result; } catch (err) { - log.info(msg(`attempt ${thisAttempt} failed with: ${err.message}`), err); + log.warning(msg(`attempt ${thisAttempt} failed with: ${err.message}`), err); // If not an error that is retryable, then end loop here and return that error; if (!isRetryableError(err)) { @@ -157,3 +158,26 @@ createToolingLogger.setDefaultLogLevelFromCliFlags = (flags) => { ? 'error' : 'info'; }; + +/** + * Get human readable string of time elapsed between to dates. Return value will be in the format + * of `hh:mm:ss.ms` + * @param startDate + * @param endTime + */ +export const getElapsedTime = ( + startDate: string | Date, + endTime: string | Date = new Date() +): string => { + const durationObj = moment.duration(moment(endTime).diff(startDate)); + const pad = (num: number, max = 2): string => { + return String(num).padStart(max, '0'); + }; + + const hours = pad(durationObj.hours()); + const minutes = pad(durationObj.minutes()); + const seconds = pad(durationObj.seconds()); + const milliseconds = pad(durationObj.milliseconds(), 3); + + return `${hours}:${minutes}:${seconds}.${milliseconds}`; +}; diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx index e485dde1bd2fe..fe0889e80cda7 100644 --- a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/isolate_form.tsx @@ -31,20 +31,10 @@ export interface EndpointIsolatedFormProps { messageAppend?: ReactNode; /** If true, then `Confirm` and `Cancel` buttons will be disabled, and `Confirm` button will loading loading style */ isLoading?: boolean; - hideCommentField?: boolean; } export const EndpointIsolateForm = memo( - ({ - hostName, - onCancel, - onConfirm, - onChange, - comment = '', - messageAppend, - isLoading = false, - hideCommentField = false, - }) => { + ({ hostName, onCancel, onConfirm, onChange, comment = '', messageAppend, isLoading = false }) => { const handleCommentChange: ChangeEventHandler = useCallback( (event) => { onChange({ comment: event.target.value }); @@ -76,17 +66,15 @@ export const EndpointIsolateForm = memo( - {!hideCommentField && ( - - - - )} + + + diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx index aa5591f7b5d27..b1ffb60c6bbff 100644 --- a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/unisolate_form.tsx @@ -23,16 +23,7 @@ import { CANCEL, COMMENT, COMMENT_PLACEHOLDER, CONFIRM, UNISOLATE, ISOLATED } fr import type { EndpointIsolatedFormProps } from './isolate_form'; export const EndpointUnisolateForm = memo( - ({ - hostName, - onCancel, - onConfirm, - onChange, - comment = '', - messageAppend, - isLoading = false, - hideCommentField = false, - }) => { + ({ hostName, onCancel, onConfirm, onChange, comment = '', messageAppend, isLoading = false }) => { const handleCommentChange: ChangeEventHandler = useCallback( (event) => { onChange({ comment: event.target.value }); @@ -61,17 +52,15 @@ export const EndpointUnisolateForm = memo( - {!hideCommentField && ( - - - - )} + + + diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/actions.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/actions.tsx index 930e510ff07fa..ab7d86a7d6303 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/actions.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/actions.tsx @@ -53,6 +53,7 @@ const VisualizationActionsComponent: React.FC = ({ scopeId = SourcererScopeName.default, stackByField, withActions = DEFAULT_ACTIONS, + casesAttachmentMetadata, }) => { const [isPopoverOpen, setPopover] = useState(false); const [isInspectModalOpen, setIsInspectModalOpen] = useState(false); @@ -121,6 +122,7 @@ const VisualizationActionsComponent: React.FC = ({ inspectActionProps, timeRange: timerange, withActions, + lensMetadata: casesAttachmentMetadata, }); const panels = useAsync( diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_embeddable.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_embeddable.tsx index 05e52a06834a2..aaa780e379c5e 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_embeddable.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_embeddable.tsx @@ -79,6 +79,7 @@ const LensEmbeddableComponent: React.FC = ({ width: wrapperWidth, withActions = DEFAULT_ACTIONS, disableOnClickFilter = false, + casesAttachmentMetadata, }) => { const style = useMemo( () => ({ @@ -152,6 +153,7 @@ const LensEmbeddableComponent: React.FC = ({ inspectActionProps, timeRange: timerange, withActions, + lensMetadata: casesAttachmentMetadata, }); const updateDateRange = useCallback( @@ -240,6 +242,7 @@ const LensEmbeddableComponent: React.FC = ({ timerange={timerange} title={inspectTitle} withActions={withActions} + casesAttachmentMetadata={casesAttachmentMetadata} />
diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/types.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/types.ts index b09e1fe2cc46c..131c8f72bab33 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/types.ts @@ -15,6 +15,7 @@ import type { DataViewSpec } from '@kbn/data-views-plugin/common'; import type { Action } from '@kbn/ui-actions-plugin/public'; import type { Filter, Query } from '@kbn/es-query'; +import type { LensProps } from '@kbn/cases-plugin/public/types'; import type { InputsModelId } from '../../store/inputs/constants'; import type { SourcererScopeName } from '../../store/sourcerer/model'; import type { Status } from '../../../../common/api/detection_engine'; @@ -61,6 +62,7 @@ export interface VisualizationActionsProps { timerange: { from: string; to: string }; title: React.ReactNode; withActions?: VisualizationContextMenuActions[]; + casesAttachmentMetadata?: LensProps['metadata']; } export interface EmbeddableData { @@ -100,6 +102,11 @@ export interface LensEmbeddableComponentProps { * Disable the on click filter for the visualization. */ disableOnClickFilter?: boolean; + + /** + * Metadata for cases Attachable visualization. + */ + casesAttachmentMetadata?: LensProps['metadata']; } export enum RequestStatus { diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts index 8085097838307..4d487dcd9186d 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_actions.ts @@ -10,6 +10,7 @@ import type { Action, Trigger } from '@kbn/ui-actions-plugin/public'; import { createAction } from '@kbn/ui-actions-plugin/public'; import type { ActionDefinition } from '@kbn/ui-actions-plugin/public/actions'; +import type { LensProps } from '@kbn/cases-plugin/public/types'; import { useKibana } from '../../lib/kibana/kibana_react'; import { useAddToExistingCase } from './use_add_to_existing_case'; import { useAddToNewCase } from './use_add_to_new_case'; @@ -84,12 +85,14 @@ const ACTION_DEFINITION: Record< export const useActions = ({ attributes, + lensMetadata, extraActions = [], inspectActionProps, timeRange, withActions = DEFAULT_ACTIONS, }: { attributes: LensAttributes | null; + lensMetadata?: LensProps['metadata']; extraActions?: Action[]; inspectActionProps: { handleInspectClick: () => void; @@ -123,11 +126,13 @@ export const useActions = ({ useAddToExistingCase({ lensAttributes: attributes, timeRange, + lensMetadata, }); const { onAddToNewCaseClicked, disabled: isAddToNewCaseDisabled } = useAddToNewCase({ timeRange, lensAttributes: attributes, + lensMetadata, }); const { openSaveVisualizationFlyout, disableVisualizations } = useSaveToLibrary({ attributes }); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.test.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.test.tsx index cc03f80daf95b..2ed014ee69a37 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.test.tsx @@ -56,6 +56,7 @@ describe('useAddToExistingCase', () => { lensAttributes: kpiHostMetricLensAttributes, timeRange, onAddToCaseClicked: mockOnAddToCaseClicked, + lensMetadata: undefined, }) ); expect(mockGetUseCasesAddToExistingCaseModal).toHaveBeenCalledWith({ @@ -75,6 +76,7 @@ describe('useAddToExistingCase', () => { lensAttributes: kpiHostMetricLensAttributes, timeRange, onAddToCaseClicked: mockOnAddToCaseClicked, + lensMetadata: undefined, }) ); expect(result.current.disabled).toEqual(true); @@ -88,6 +90,7 @@ describe('useAddToExistingCase', () => { lensAttributes: kpiHostMetricLensAttributes, timeRange, onAddToCaseClicked: mockOnAddToCaseClicked, + lensMetadata: undefined, }) ); expect(result.current.disabled).toEqual(true); @@ -99,6 +102,7 @@ describe('useAddToExistingCase', () => { lensAttributes: null, timeRange, onAddToCaseClicked: mockOnAddToCaseClicked, + lensMetadata: undefined, }) ); expect(result.current.disabled).toEqual(true); @@ -110,6 +114,7 @@ describe('useAddToExistingCase', () => { lensAttributes: kpiHostMetricLensAttributes, timeRange: null, onAddToCaseClicked: mockOnAddToCaseClicked, + lensMetadata: undefined, }) ); expect(result.current.disabled).toEqual(true); @@ -118,6 +123,9 @@ describe('useAddToExistingCase', () => { it('should open add to existing case modal', () => { const mockOpenCaseModal = jest.fn(); const mockClick = jest.fn(); + const lensMetadata = { + description: 'test_description', + }; mockGetUseCasesAddToExistingCaseModal.mockReturnValue({ open: mockOpenCaseModal }); @@ -126,6 +134,7 @@ describe('useAddToExistingCase', () => { lensAttributes: kpiHostMetricLensAttributes, timeRange, onAddToCaseClicked: mockClick, + lensMetadata, }) ); @@ -137,6 +146,7 @@ describe('useAddToExistingCase', () => { persistableStateAttachmentState: { attributes: kpiHostMetricLensAttributes, timeRange, + metadata: lensMetadata, }, persistableStateAttachmentTypeId: '.lens', type: AttachmentType.persistableState as const, diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx index 8f28e9534e6a7..1675802b9953e 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_existing_case.tsx @@ -8,31 +8,37 @@ import { useCallback, useMemo } from 'react'; import { AttachmentType, LENS_ATTACHMENT_TYPE } from '@kbn/cases-plugin/common'; import type { CaseAttachmentsWithoutOwner } from '@kbn/cases-plugin/public'; +import type { LensProps } from '@kbn/cases-plugin/public/types'; import { APP_ID } from '../../../../common'; import { useKibana } from '../../lib/kibana'; import { ADD_TO_CASE_SUCCESS } from './translations'; -import type { LensAttributes } from './types'; export const useAddToExistingCase = ({ onAddToCaseClicked, lensAttributes, timeRange, + lensMetadata, }: { onAddToCaseClicked?: () => void; - lensAttributes: LensAttributes | null; - timeRange: { from: string; to: string } | null; + lensAttributes: LensProps['attributes'] | null; + timeRange: LensProps['timeRange'] | null; + lensMetadata: LensProps['metadata']; }) => { const { cases } = useKibana().services; const userCasesPermissions = cases.helpers.canUseCases([APP_ID]); const attachments = useMemo(() => { return [ { - persistableStateAttachmentState: { attributes: lensAttributes, timeRange }, + persistableStateAttachmentState: { + attributes: lensAttributes, + timeRange, + metadata: lensMetadata, + }, persistableStateAttachmentTypeId: LENS_ATTACHMENT_TYPE, type: AttachmentType.persistableState as const, }, ] as CaseAttachmentsWithoutOwner; - }, [lensAttributes, timeRange]); + }, [lensAttributes, lensMetadata, timeRange]); const selectCaseModal = cases.hooks.useCasesAddToExistingCaseModal({ onClose: onAddToCaseClicked, diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx index 68f730b376dcf..aca5ba88dc057 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_add_to_new_case.tsx @@ -8,31 +8,40 @@ import { useCallback, useMemo } from 'react'; import { AttachmentType, LENS_ATTACHMENT_TYPE } from '@kbn/cases-plugin/common'; import type { CaseAttachmentsWithoutOwner } from '@kbn/cases-plugin/public'; +import type { LensProps } from '@kbn/cases-plugin/public/types'; import { APP_ID } from '../../../../common'; import { useKibana } from '../../lib/kibana'; import { ADD_TO_CASE_SUCCESS } from './translations'; -import type { LensAttributes } from './types'; - export interface UseAddToNewCaseProps { onClick?: () => void; - timeRange: { from: string; to: string } | null; - lensAttributes: LensAttributes | null; + lensAttributes: LensProps['attributes'] | null; + timeRange: LensProps['timeRange'] | null; + lensMetadata?: LensProps['metadata']; } -export const useAddToNewCase = ({ onClick, timeRange, lensAttributes }: UseAddToNewCaseProps) => { +export const useAddToNewCase = ({ + onClick, + timeRange, + lensAttributes, + lensMetadata, +}: UseAddToNewCaseProps) => { const { cases } = useKibana().services; const userCasesPermissions = cases.helpers.canUseCases([APP_ID]); const attachments = useMemo(() => { return [ { - persistableStateAttachmentState: { attributes: lensAttributes, timeRange }, + persistableStateAttachmentState: { + attributes: lensAttributes, + timeRange, + metadata: lensMetadata, + }, persistableStateAttachmentTypeId: LENS_ATTACHMENT_TYPE, type: AttachmentType.persistableState as const, }, ] as CaseAttachmentsWithoutOwner; - }, [lensAttributes, timeRange]); + }, [lensAttributes, lensMetadata, timeRange]); const createCaseFlyout = cases.hooks.useCasesAddToNewCaseFlyout({ toastContent: ADD_TO_CASE_SUCCESS, diff --git a/x-pack/plugins/security_solution/public/common/store/data_table/epic_local_storage.test.tsx b/x-pack/plugins/security_solution/public/common/store/data_table/epic_local_storage.test.tsx deleted file mode 100644 index d7ea246e90109..0000000000000 --- a/x-pack/plugins/security_solution/public/common/store/data_table/epic_local_storage.test.tsx +++ /dev/null @@ -1,185 +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'; - -// we don't have the types for waitFor just yet, so using "as waitFor" for when we do -import { waitFor } from '@testing-library/react'; -import '../../mock/match_media'; -import { - mockGlobalState, - SUB_PLUGINS_REDUCER, - TestProviders, - defaultHeaders, - createSecuritySolutionStorageMock, - kibanaObservable, -} from '../../mock'; - -import type { State } from '..'; -import { createStore } from '..'; -import { DefaultCellRenderer } from '../../../timelines/components/timeline/cell_rendering/default_cell_renderer'; -import type { EventsViewerProps } from '../../components/events_viewer'; -import { defaultRowRenderers } from '../../../timelines/components/timeline/body/renderers'; - -import { addTableInStorage } from '../../../timelines/containers/local_storage'; -import { Direction } from '../../../../common/search_strategy'; -import { StatefulEventsViewer } from '../../components/events_viewer'; -import { eventsDefaultModel } from '../../components/events_viewer/default_model'; -import { EntityType } from '@kbn/timelines-plugin/common'; -import { getDefaultControlColumn } from '../../../timelines/components/timeline/body/control_columns'; -import { SourcererScopeName } from '../sourcerer/model'; -import { TableId, dataTableActions } from '@kbn/securitysolution-data-table'; - -const { - applyDeltaToColumnWidth, - removeColumn, - updateColumnOrder, - updateColumns, - updateColumnWidth, - updateItemsPerPage, - updateSort, - upsertColumn, -} = dataTableActions; - -jest.mock('../../../timelines/containers/local_storage'); - -const addTableInStorageMock = addTableInStorage as jest.Mock; - -describe('epicLocalStorage', () => { - const state: State = mockGlobalState; - const { storage } = createSecuritySolutionStorageMock(); - let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); - - let testProps = {} as EventsViewerProps; - - beforeEach(() => { - store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); - const from = '2019-08-27T22:10:56.794Z'; - const to = '2019-08-26T22:10:56.791Z'; - const ACTION_BUTTON_COUNT = 4; - - testProps = { - defaultModel: eventsDefaultModel, - end: to, - entityType: EntityType.EVENTS, - tableId: TableId.test, - leadingControlColumns: getDefaultControlColumn(ACTION_BUTTON_COUNT), - renderCellValue: DefaultCellRenderer, - rowRenderers: defaultRowRenderers, - sourcererScope: SourcererScopeName.default, - start: from, - bulkActions: false, - hasCrudPermissions: true, - }; - }); - - it('persist adding / reordering of a column correctly', async () => { - shallow( - - - - ); - store.dispatch(upsertColumn({ id: TableId.test, index: 1, column: defaultHeaders[0] })); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); - - it('persist timeline when removing a column ', async () => { - shallow( - - - - ); - store.dispatch(removeColumn({ id: TableId.test, columnId: '@timestamp' })); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); - - it('persists resizing of a column', async () => { - shallow( - - - - ); - store.dispatch( - applyDeltaToColumnWidth({ id: TableId.test, columnId: '@timestamp', delta: 80 }) - ); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); - - it('persist the resetting of the fields', async () => { - shallow( - - - - ); - store.dispatch(updateColumns({ id: TableId.test, columns: defaultHeaders })); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); - - it('persist items per page', async () => { - shallow( - - - - ); - store.dispatch(updateItemsPerPage({ id: TableId.test, itemsPerPage: 50 })); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); - - it('persist the sorting of a column', async () => { - shallow( - - - - ); - store.dispatch( - updateSort({ - id: TableId.test, - sort: [ - { - columnId: 'event.severity', - columnType: 'number', - esTypes: ['long'], - sortDirection: Direction.desc, - }, - ], - }) - ); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); - - it('persists updates to the column order to local storage', async () => { - shallow( - - - - ); - store.dispatch( - updateColumnOrder({ - columnIds: ['event.severity', '@timestamp', 'event.category'], - id: TableId.test, - }) - ); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); - - it('persists updates to the column width to local storage', async () => { - shallow( - - - - ); - store.dispatch( - updateColumnWidth({ - columnId: 'event.severity', - id: TableId.test, - width: 123, - }) - ); - await waitFor(() => expect(addTableInStorageMock).toHaveBeenCalled()); - }); -}); diff --git a/x-pack/plugins/security_solution/public/common/store/data_table/epic_local_storage.ts b/x-pack/plugins/security_solution/public/common/store/data_table/middleware_local_storage.ts similarity index 53% rename from x-pack/plugins/security_solution/public/common/store/data_table/epic_local_storage.ts rename to x-pack/plugins/security_solution/public/common/store/data_table/middleware_local_storage.ts index f84b29341b712..0d8b63f8c283a 100644 --- a/x-pack/plugins/security_solution/public/common/store/data_table/epic_local_storage.ts +++ b/x-pack/plugins/security_solution/public/common/store/data_table/middleware_local_storage.ts @@ -5,17 +5,16 @@ * 2.0. */ -import type { Action } from 'redux'; -import { map, filter, ignoreElements, tap, withLatestFrom, delay } from 'rxjs/operators'; -import type { Epic } from 'redux-observable'; +import type { Action, Middleware } from 'redux'; import { get } from 'lodash/fp'; -import { dataTableActions } from '@kbn/securitysolution-data-table'; +import type { Storage } from '@kbn/kibana-utils-plugin/public'; +import { dataTableActions, dataTableSelectors } from '@kbn/securitysolution-data-table'; import type { TableIdLiteral } from '@kbn/securitysolution-data-table'; import { updateTotalCount } from '../../../timelines/store/actions'; import { addTableInStorage } from '../../../timelines/containers/local_storage'; -import type { TimelineEpicDependencies } from '../../../timelines/store/types'; +import type { State } from '../types'; const { applyDeltaToColumnWidth, @@ -32,8 +31,6 @@ const { upsertColumn, } = dataTableActions; -export const isNotNull = (value: T | null): value is T => value !== null; - const tableActionTypes = new Set([ removeColumn.type, upsertColumn.type, @@ -50,21 +47,19 @@ const tableActionTypes = new Set([ toggleDetailPanel.type, ]); -export const createDataTableLocalStorageEpic = - (): Epic> => - (action$, state$, { tableByIdSelector, storage }) => { - const table$ = state$.pipe(map(tableByIdSelector), filter(isNotNull)); - return action$.pipe( - delay(500), - withLatestFrom(table$), - tap(([action, tableById]) => { - if (tableActionTypes.has(action.type)) { - if (storage) { - const tableId: TableIdLiteral = get('payload.id', action); - addTableInStorage(storage, tableId, tableById[tableId]); - } - } - }), - ignoreElements() - ); +export const dataTableLocalStorageMiddleware: (storage: Storage) => Middleware<{}, State> = + (storage: Storage) => (store) => (next) => (action: Action) => { + // perform the action + const ret = next(action); + + // persist the data table state when a table action has been performed + if (tableActionTypes.has(action.type)) { + const tableById = dataTableSelectors.tableByIdSelector(store.getState()); + const tableId: TableIdLiteral = get('payload.id', action); + if (tableById && tableById[tableId] && storage) { + addTableInStorage(storage, tableId, tableById[tableId]); + } + } + + return ret; }; diff --git a/x-pack/plugins/security_solution/public/common/store/data_table/middlware_local_storage.test.ts b/x-pack/plugins/security_solution/public/common/store/data_table/middlware_local_storage.test.ts new file mode 100644 index 0000000000000..251d40527e79f --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/store/data_table/middlware_local_storage.test.ts @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import '../../mock/match_media'; +import { + mockGlobalState, + SUB_PLUGINS_REDUCER, + defaultHeaders, + createSecuritySolutionStorageMock, + kibanaObservable, +} from '../../mock'; + +import type { State } from '..'; +import { createStore } from '..'; + +import { addTableInStorage } from '../../../timelines/containers/local_storage'; +import { Direction } from '../../../../common/search_strategy'; +import { TableId, dataTableActions } from '@kbn/securitysolution-data-table'; + +const { + applyDeltaToColumnWidth, + removeColumn, + updateColumnOrder, + updateColumns, + updateColumnWidth, + updateItemsPerPage, + updateSort, + upsertColumn, +} = dataTableActions; + +jest.mock('../../../timelines/containers/local_storage'); + +const addTableInStorageMock = addTableInStorage as jest.Mock; + +describe('DataTable localStorage middleware', () => { + const state: State = mockGlobalState; + const { storage } = createSecuritySolutionStorageMock(); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + + beforeEach(() => { + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + }); + + it('should call the storage method with the most recent table state', () => { + store.dispatch(updateItemsPerPage({ id: TableId.test, itemsPerPage: 42 })); + expect(addTableInStorageMock).toHaveBeenCalledWith( + storage, + TableId.test, + expect.objectContaining({ + itemsPerPage: 42, + }) + ); + }); + + it('persist adding / reordering of a column correctly', () => { + store.dispatch(upsertColumn({ id: TableId.test, index: 1, column: defaultHeaders[0] })); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); + + it('persist timeline when removing a column ', async () => { + store.dispatch(removeColumn({ id: TableId.test, columnId: '@timestamp' })); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); + + it('persists resizing of a column', async () => { + store.dispatch( + applyDeltaToColumnWidth({ id: TableId.test, columnId: '@timestamp', delta: 80 }) + ); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); + + it('persist the resetting of the fields', async () => { + store.dispatch(updateColumns({ id: TableId.test, columns: defaultHeaders })); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); + + it('persist items per page', async () => { + store.dispatch(updateItemsPerPage({ id: TableId.test, itemsPerPage: 50 })); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); + + it('persist the sorting of a column', async () => { + store.dispatch( + updateSort({ + id: TableId.test, + sort: [ + { + columnId: 'event.severity', + columnType: 'number', + esTypes: ['long'], + sortDirection: Direction.desc, + }, + ], + }) + ); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); + + it('persists updates to the column order to local storage', async () => { + store.dispatch( + updateColumnOrder({ + columnIds: ['event.severity', '@timestamp', 'event.category'], + id: TableId.test, + }) + ); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); + + it('persists updates to the column width to local storage', async () => { + store.dispatch( + updateColumnWidth({ + columnId: 'event.severity', + id: TableId.test, + width: 123, + }) + ); + expect(addTableInStorageMock).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/store/epic.ts b/x-pack/plugins/security_solution/public/common/store/epic.ts index 20311d6c4a163..a5cebee7c96b6 100644 --- a/x-pack/plugins/security_solution/public/common/store/epic.ts +++ b/x-pack/plugins/security_solution/public/common/store/epic.ts @@ -9,21 +9,16 @@ import type { Epic } from 'redux-observable'; import { combineEpics } from 'redux-observable'; import type { Action } from 'redux'; import type { Observable } from 'rxjs'; -import type { Storage } from '@kbn/kibana-utils-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import { createTimelineEpic } from '../../timelines/store/epic'; -import { createTimelineChangedEpic } from '../../timelines/store/epic_changed'; import { createTimelineFavoriteEpic } from '../../timelines/store/epic_favorite'; import { createTimelineNoteEpic } from '../../timelines/store/epic_note'; import { createTimelinePinnedEventEpic } from '../../timelines/store/epic_pinned_event'; import type { TimelineEpicDependencies } from '../../timelines/store/types'; -import { createDataTableLocalStorageEpic } from './data_table/epic_local_storage'; -import { createUserAssetTableLocalStorageEpic } from '../../explore/users/store/epic_storage'; import type { State } from './types'; export interface RootEpicDependencies { kibana$: Observable; - storage: Storage; } export const createRootEpic = (): Epic< @@ -34,10 +29,7 @@ export const createRootEpic = (): Epic< > => combineEpics( createTimelineEpic(), - createTimelineChangedEpic(), createTimelineFavoriteEpic(), createTimelineNoteEpic(), - createTimelinePinnedEventEpic(), - createDataTableLocalStorageEpic(), - createUserAssetTableLocalStorageEpic() + createTimelinePinnedEventEpic() ); diff --git a/x-pack/plugins/security_solution/public/common/store/middlewares.ts b/x-pack/plugins/security_solution/public/common/store/middlewares.ts new file mode 100644 index 0000000000000..f65cc2abe0a53 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/store/middlewares.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { Storage } from '@kbn/kibana-utils-plugin/public'; + +import { createTimelineMiddlewares } from '../../timelines/store/middlewares/create_timeline_middlewares'; +import { dataTableLocalStorageMiddleware } from './data_table/middleware_local_storage'; +import { userAssetTableLocalStorageMiddleware } from '../../explore/users/store/middleware_storage'; + +export function createMiddlewares(storage: Storage) { + return [ + dataTableLocalStorageMiddleware(storage), + userAssetTableLocalStorageMiddleware(storage), + ...createTimelineMiddlewares(), + ]; +} diff --git a/x-pack/plugins/security_solution/public/common/store/store.ts b/x-pack/plugins/security_solution/public/common/store/store.ts index b9f29867a32b5..bcdd7b67b3b44 100644 --- a/x-pack/plugins/security_solution/public/common/store/store.ts +++ b/x-pack/plugins/security_solution/public/common/store/store.ts @@ -24,7 +24,6 @@ import { BehaviorSubject, pluck } from 'rxjs'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import reduceReducers from 'reduce-reducers'; -import { dataTableSelectors } from '@kbn/securitysolution-data-table'; import { initialGroupingState } from './grouping/reducer'; import type { GroupState } from './grouping/types'; import { @@ -55,6 +54,7 @@ import type { AnalyzerState } from '../../resolver/types'; import { resolverMiddlewareFactory } from '../../resolver/store/middleware'; import { dataAccessLayerFactory } from '../../resolver/data_access_layer/factory'; import { sourcererActions } from './sourcerer'; +import { createMiddlewares } from './middlewares'; let store: Store | null = null; @@ -278,8 +278,6 @@ export const createStore = ( selectNotesByIdSelector: appSelectors.selectNotesByIdSelector, timelineByIdSelector: timelineSelectors.timelineByIdSelector, timelineTimeRangeSelector: inputsSelectors.timelineTimeRangeSelector, - tableByIdSelector: dataTableSelectors.tableByIdSelector, - storage, }; const epicMiddleware = createEpicMiddleware( @@ -289,6 +287,7 @@ export const createStore = ( ); const middlewareEnhancer = applyMiddleware( + ...createMiddlewares(storage), epicMiddleware, telemetryMiddleware, ...(additionalMiddleware ?? []) diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx index 7950c60a809fe..0bb767b65275b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx @@ -6,11 +6,10 @@ */ import React, { useMemo } from 'react'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; import { getSentinelOneAgentId } from '../../../common/utils/sentinelone_alert_check'; import { useCasesFromAlerts } from '../../containers/detection_engine/alerts/use_cases_from_alerts'; import type { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; -import { IsolateSentinelOneHost } from './isolate_sentinelone'; -import { UnisolateSentinelOneHost } from './unisolate_sentinelone'; import { getFieldValue } from './helpers'; import { IsolateHost } from './isolate'; import { UnisolateHost } from './unisolate'; @@ -27,7 +26,7 @@ export const HostIsolationPanel = React.memo( successCallback?: () => void; isolateAction: string; }) => { - const endpointId = useMemo( + const elasticAgentId = useMemo( () => getFieldValue({ category: 'agent', field: 'agent.id' }, details), [details] ); @@ -46,29 +45,22 @@ export const HostIsolationPanel = React.memo( const { casesInfo } = useCasesFromAlerts({ alertId }); - if (sentinelOneAgentId) { - return isolateAction === 'isolateHost' ? ( - - ) : ( - - ); - } + const agentType: ResponseActionAgentType = useMemo( + () => (sentinelOneAgentId ? 'sentinel_one' : 'endpoint'), + [sentinelOneAgentId] + ); + + const endpointId = useMemo( + () => sentinelOneAgentId ?? elasticAgentId, + [elasticAgentId, sentinelOneAgentId] + ); return isolateAction === 'isolateHost' ? ( @@ -77,6 +69,7 @@ export const HostIsolationPanel = React.memo( endpointId={endpointId} hostName={hostName} casesInfo={casesInfo} + agentType={agentType} cancelCallback={cancelCallback} successCallback={successCallback} /> diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx index 76e0ef2750963..37fa3ad4bfccc 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx @@ -8,6 +8,7 @@ import React, { useMemo, useState, useCallback } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; import { useHostIsolation } from '../../containers/detection_engine/alerts/use_host_isolation'; import { CASES_ASSOCIATED_WITH_ALERT, RETURN_TO_ALERT_DETAILS } from './translations'; import type { EndpointIsolatedFormProps } from '../../../common/components/endpoint/host_isolation'; @@ -22,12 +23,14 @@ export const IsolateHost = React.memo( endpointId, hostName, casesInfo, + agentType, cancelCallback, successCallback, }: { endpointId: string; hostName: string; casesInfo: CasesFromAlertsResponse; + agentType: ResponseActionAgentType; cancelCallback: () => void; successCallback?: () => void; }) => { @@ -42,6 +45,7 @@ export const IsolateHost = React.memo( endpointId, comment, caseIds, + agentType, }); const confirmHostIsolation = useCallback(async () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate_sentinelone.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate_sentinelone.tsx deleted file mode 100644 index 17f50418d187a..0000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate_sentinelone.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useState, useCallback } from 'react'; -import { EuiSpacer } from '@elastic/eui'; -import { SENTINELONE_CONNECTOR_ID, SUB_ACTION } from '@kbn/stack-connectors-plugin/public/common'; -import { useLoadConnectors } from '../../../common/components/response_actions/use_load_connectors'; -import { useSubActionMutation } from '../../../timelines/components/side_panel/event_details/flyout/use_sub_action_mutation'; -import { RETURN_TO_ALERT_DETAILS } from './translations'; -import { - EndpointIsolateForm, - ActionCompletionReturnButton, -} from '../../../common/components/endpoint/host_isolation'; - -export const IsolateSentinelOneHost = React.memo( - ({ - sentinelOneAgentId, - hostName, - cancelCallback, - successCallback, - }: { - sentinelOneAgentId: string; - hostName: string; - cancelCallback: () => void; - successCallback?: () => void; - }) => { - const { data: connectors } = useLoadConnectors({ actionTypeId: SENTINELONE_CONNECTOR_ID }); - const connector = useMemo(() => connectors?.[0], [connectors]); - - const [isIsolated, setIsIsolated] = useState(false); - - const { mutateAsync: isolateHost, isLoading } = useSubActionMutation({ - connectorId: connector?.id as string, - subAction: SUB_ACTION.ISOLATE_HOST, - subActionParams: { - uuid: sentinelOneAgentId, - }, - }); - - const onChange = useCallback(() => {}, []); - - const confirmHostIsolation = useCallback(async () => { - const response = await isolateHost(); - - if (response.status === 'ok') { - setIsIsolated(true); - - if (successCallback) { - successCallback(); - } - } - }, [isolateHost, successCallback]); - - const backToAlertDetails = useCallback(() => cancelCallback(), [cancelCallback]); - - const hostIsolatedSuccessButton = useMemo( - () => ( - - ), - [backToAlertDetails] - ); - - const hostNotIsolated = useMemo( - () => ( - <> - - - - ), - [hostName, backToAlertDetails, confirmHostIsolation, isLoading, onChange] - ); - - return isIsolated ? hostIsolatedSuccessButton : hostNotIsolated; - } -); - -IsolateSentinelOneHost.displayName = 'IsolateSentinelOneHost'; diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx index 0cfdffb559d31..15c59da521579 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx @@ -8,6 +8,7 @@ import React, { useMemo, useState, useCallback } from 'react'; import { EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import type { ResponseActionAgentType } from '../../../../common/endpoint/service/response_actions/constants'; import { CASES_ASSOCIATED_WITH_ALERT, RETURN_TO_ALERT_DETAILS } from './translations'; import type { EndpointIsolatedFormProps } from '../../../common/components/endpoint/host_isolation'; import { @@ -22,12 +23,14 @@ export const UnisolateHost = React.memo( endpointId, hostName, casesInfo, + agentType, cancelCallback, successCallback, }: { endpointId: string; hostName: string; casesInfo: CasesFromAlertsResponse; + agentType: ResponseActionAgentType; cancelCallback: () => void; successCallback?: () => void; }) => { @@ -42,6 +45,7 @@ export const UnisolateHost = React.memo( endpointId, comment, caseIds, + agentType, }); const confirmHostUnIsolation = useCallback(async () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate_sentinelone.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate_sentinelone.tsx deleted file mode 100644 index d58fa83e08abd..0000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate_sentinelone.tsx +++ /dev/null @@ -1,89 +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, { useMemo, useState, useCallback } from 'react'; -import { EuiSpacer } from '@elastic/eui'; -import { SENTINELONE_CONNECTOR_ID, SUB_ACTION } from '@kbn/stack-connectors-plugin/public/common'; -import { useLoadConnectors } from '../../../common/components/response_actions/use_load_connectors'; -import { useSubActionMutation } from '../../../timelines/components/side_panel/event_details/flyout/use_sub_action_mutation'; -import { RETURN_TO_ALERT_DETAILS } from './translations'; -import { - EndpointUnisolateForm, - ActionCompletionReturnButton, -} from '../../../common/components/endpoint/host_isolation'; - -export const UnisolateSentinelOneHost = React.memo( - ({ - sentinelOneAgentId, - hostName, - cancelCallback, - successCallback, - }: { - sentinelOneAgentId: string; - hostName: string; - cancelCallback: () => void; - successCallback?: () => void; - }) => { - const [isUnIsolated, setIsUnIsolated] = useState(false); - const { data: connectors } = useLoadConnectors({ actionTypeId: SENTINELONE_CONNECTOR_ID }); - const connector = useMemo(() => connectors?.[0], [connectors]); - - const { mutateAsync: unIsolateHost, isLoading } = useSubActionMutation({ - // @ts-expect-error update types - connectorId: connector?.id, - subAction: SUB_ACTION.RELEASE_HOST, - subActionParams: { - uuid: sentinelOneAgentId, - }, - }); - - const confirmHostUnIsolation = useCallback(async () => { - const response = await unIsolateHost(); - - if (response.status === 'ok') { - setIsUnIsolated(true); - - if (successCallback) { - successCallback(); - } - } - }, [successCallback, unIsolateHost]); - - const onChange = useCallback(() => {}, []); - - const backToAlertDetails = useCallback(() => cancelCallback(), [cancelCallback]); - - const hostUnisolatedSuccessButton = useMemo(() => { - return ( - - ); - }, [backToAlertDetails]); - - const hostNotUnisolated = useMemo(() => { - return ( - <> - - - - ); - }, [hostName, backToAlertDetails, confirmHostUnIsolation, onChange, isLoading]); - - return isUnIsolated ? hostUnisolatedSuccessButton : hostNotUnisolated; - } -); - -UnisolateSentinelOneHost.displayName = 'UnisolateSentinelOneHost'; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts index 92801daeba514..c87c69c062720 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.test.ts @@ -245,11 +245,12 @@ describe('Detections Alerts API', () => { endpointId: 'fd8a122b-4c54-4c05-b295-e5f8381fc59d', comment: 'commento', caseIds: ['88c04a90-b19c-11eb-b838-bf3c7840b969'], + agentType: 'endpoint', }); expect(postMock).toHaveBeenCalledWith( '/api/endpoint/action/isolate', expect.objectContaining({ - body: '{"endpoint_ids":["fd8a122b-4c54-4c05-b295-e5f8381fc59d"],"comment":"commento","case_ids":["88c04a90-b19c-11eb-b838-bf3c7840b969"]}', + body: '{"endpoint_ids":["fd8a122b-4c54-4c05-b295-e5f8381fc59d"],"comment":"commento","case_ids":["88c04a90-b19c-11eb-b838-bf3c7840b969"],"agent_type":"endpoint"}', version: '2023-10-31', }) ); @@ -260,6 +261,7 @@ describe('Detections Alerts API', () => { endpointId: 'fd8a122b-4c54-4c05-b295-e5f8381fc59d', comment: 'commento', caseIds: ['88c04a90-b19c-11eb-b838-bf3c7840b969'], + agentType: 'endpoint', }); expect(hostIsolationResponse).toEqual(mockHostIsolation); }); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts index ecd53bbf76a89..e54e4f8e8ef39 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts @@ -7,6 +7,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { getCasesFromAlertsUrl } from '@kbn/cases-plugin/common'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import type { ResponseActionApiResponse, HostInfo } from '../../../../../common/endpoint/types'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL, @@ -188,15 +189,18 @@ export const createHostIsolation = async ({ endpointId, comment = '', caseIds, + agentType, }: { endpointId: string; comment?: string; caseIds?: string[]; + agentType: ResponseActionAgentType; }): Promise => isolateHost({ endpoint_ids: [endpointId], comment, case_ids: caseIds, + agent_type: agentType, }); /** @@ -212,15 +216,18 @@ export const createHostUnIsolation = async ({ endpointId, comment = '', caseIds, + agentType, }: { endpointId: string; comment?: string; caseIds?: string[]; + agentType: ResponseActionAgentType; }): Promise => unIsolateHost({ endpoint_ids: [endpointId], comment, case_ids: caseIds, + agent_type: agentType, }); /** diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx index 64b6d4afb428f..85b2bea5d2695 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx @@ -6,6 +6,7 @@ */ import { useCallback, useState } from 'react'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { HOST_ISOLATION_FAILURE } from './translations'; import { createHostIsolation } from './api'; @@ -20,12 +21,14 @@ interface UseHostIsolationProps { endpointId: string; comment: string; caseIds?: string[]; + agentType: ResponseActionAgentType; } export const useHostIsolation = ({ endpointId, comment, caseIds, + agentType, }: UseHostIsolationProps): HostIsolationStatus => { const [loading, setLoading] = useState(false); const { addError } = useAppToasts(); @@ -37,6 +40,7 @@ export const useHostIsolation = ({ endpointId, comment, caseIds: caseIds && caseIds.length > 0 ? caseIds : undefined, + agentType, }); setLoading(false); return isolationStatus.action ? true : false; @@ -45,6 +49,6 @@ export const useHostIsolation = ({ addError(error.message, { title: HOST_ISOLATION_FAILURE }); return false; } - }, [endpointId, comment, caseIds, addError]); + }, [endpointId, comment, caseIds, agentType, addError]); return { loading, isolateHost }; }; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx index f630ccb13c38c..47c09186f7cba 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_unisolation.tsx @@ -6,6 +6,7 @@ */ import { useCallback, useState } from 'react'; +import type { ResponseActionAgentType } from '../../../../../common/endpoint/service/response_actions/constants'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { HOST_ISOLATION_FAILURE } from './translations'; import { createHostUnIsolation } from './api'; @@ -19,12 +20,14 @@ interface UseHostIsolationProps { endpointId: string; comment: string; caseIds?: string[]; + agentType: ResponseActionAgentType; } export const useHostUnisolation = ({ endpointId, comment, caseIds, + agentType, }: UseHostIsolationProps): HostUnisolationStatus => { const [loading, setLoading] = useState(false); const { addError } = useAppToasts(); @@ -36,6 +39,7 @@ export const useHostUnisolation = ({ endpointId, comment, caseIds: caseIds && caseIds.length > 0 ? caseIds : undefined, + agentType, }); setLoading(false); return isolationStatus.action ? true : false; @@ -44,6 +48,6 @@ export const useHostUnisolation = ({ addError(error.message, { title: HOST_ISOLATION_FAILURE }); return false; } - }, [endpointId, comment, caseIds, addError]); + }, [endpointId, comment, caseIds, agentType, addError]); return { loading, unIsolateHost }; }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx index 7ee80b8b695c9..f9b62d8801a56 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx @@ -8,6 +8,7 @@ import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; import { i18n } from '@kbn/i18n'; +import { sumBy } from 'lodash/fp'; import type { HostRiskScore, @@ -18,7 +19,7 @@ import type { interface TableItem { category: string; count: number; - score: string; + score: number; } interface EntityData { @@ -38,6 +39,12 @@ export const buildColumns: () => Array> = () => [ truncateText: false, mobileOptions: { show: true }, sortable: true, + footer: ( + + ), }, { field: 'score', @@ -51,6 +58,13 @@ export const buildColumns: () => Array> = () => [ mobileOptions: { show: true }, sortable: true, dataType: 'number', + align: 'right', + render: (score: number) => displayNumber(score), + footer: (props) => ( + + {displayNumber(sumBy((i) => i.score, props.items))} + + ), }, { field: 'count', @@ -64,6 +78,10 @@ export const buildColumns: () => Array> = () => [ mobileOptions: { show: true }, sortable: true, dataType: 'number', + align: 'right', + footer: (props) => ( + {sumBy((i) => i.count, props.items)} + ), }, ]; @@ -73,14 +91,14 @@ export const getItems: (entityData: EntityData | undefined) => TableItem[] = (en category: i18n.translate('xpack.securitySolution.flyout.entityDetails.alertsGroupLabel', { defaultMessage: 'Alerts', }), - score: displayNumber(entityData?.risk.category_1_score ?? 0), + score: entityData?.risk.category_1_score ?? 0, count: entityData?.risk.category_1_count ?? 0, }, { category: i18n.translate('xpack.securitySolution.flyout.entityDetails.contextGroupLabel', { defaultMessage: 'Contexts', }), - score: displayNumber(entityData?.risk.category_2_score ?? 0), + score: entityData?.risk.category_2_score ?? 0, count: entityData?.risk.category_2_count ?? 0, }, ]; @@ -109,4 +127,6 @@ export const getEntityData = ( const displayNumber = (num: number) => num.toFixed(2); export const LENS_VISUALIZATION_HEIGHT = 126; // Static height in pixels specified by design +export const LENS_VISUALIZATION_MIN_WIDTH = 160; // Lens visualization min-width in pixels +export const SUMMARY_TABLE_MIN_WIDTH = 180; // Summary table min-width in pixels export const LAST_30_DAYS = { from: 'now-30d', to: 'now' }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx index 485ced7dea46c..37f5d3c1d47f4 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx @@ -44,18 +44,37 @@ describe('RiskSummary', () => { ); expect(getByTestId('risk-summary-table')).toBeInTheDocument(); + + // Alerts expect(getByTestId('risk-summary-table')).toHaveTextContent( `Inputs${mockHostRiskScoreState.data?.[0].host.risk.category_1_count ?? 0}` ); expect(getByTestId('risk-summary-table')).toHaveTextContent( `AlertsScore${mockHostRiskScoreState.data?.[0].host.risk.category_1_score ?? 0}` ); + + // Context expect(getByTestId('risk-summary-table')).toHaveTextContent( `Inputs${mockHostRiskScoreState.data?.[0].host.risk.category_2_count ?? 0}` ); expect(getByTestId('risk-summary-table')).toHaveTextContent( `ContextsScore${mockHostRiskScoreState.data?.[0].host.risk.category_2_score ?? 0}` ); + + // Result + expect(getByTestId('risk-summary-result-count')).toHaveTextContent( + `${ + (mockHostRiskScoreState.data?.[0].host.risk.category_1_count ?? 0) + + (mockHostRiskScoreState.data?.[0].host.risk.category_2_count ?? 0) + }` + ); + + expect(getByTestId('risk-summary-result-score')).toHaveTextContent( + `${ + (mockHostRiskScoreState.data?.[0].host.risk.category_1_score ?? 0) + + (mockHostRiskScoreState.data?.[0].host.risk.category_2_score ?? 0) + }` + ); }); it('renders risk summary table when riskScoreData is empty', () => { @@ -125,6 +144,48 @@ describe('RiskSummary', () => { ); }); + it('builds lens cases attachment metadata for host risk score', () => { + render( + + {}} + /> + + ); + + const lensMetadata: LensAttributes = + mockVisualizationEmbeddable.mock.calls[0][0].casesAttachmentMetadata; + + expect(lensMetadata).toMatchInlineSnapshot(` + Object { + "description": "Risk score for host test", + } + `); + }); + + it('builds lens cases attachment metadata for user risk score', () => { + render( + + {}} + /> + + ); + + const lensMetadata: LensAttributes = + mockVisualizationEmbeddable.mock.calls[0][0].casesAttachmentMetadata; + + expect(lensMetadata).toMatchInlineSnapshot(` + Object { + "description": "Risk score for user test", + } + `); + }); + it('builds lens attributes for user risk score', () => { render( diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx index 9731ef7d7542f..36abf4b6e581f 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx @@ -20,7 +20,8 @@ import { import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; import { euiThemeVars } from '@kbn/ui-theme'; - +import dateMath from '@kbn/datemath'; +import { i18n } from '@kbn/i18n'; import { useKibana } from '../../../common/lib/kibana/kibana_react'; import { EntityDetailsLeftPanelTab } from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; @@ -41,6 +42,8 @@ import { isUserRiskData, LAST_30_DAYS, LENS_VISUALIZATION_HEIGHT, + LENS_VISUALIZATION_MIN_WIDTH, + SUMMARY_TABLE_MIN_WIDTH, } from './common'; export interface RiskSummaryProps { @@ -89,6 +92,29 @@ const RiskSummaryComponent = ({ [riskData, telemetry] ); + const casesAttachmentMetadata = useMemo( + () => ({ + description: i18n.translate( + 'xpack.securitySolution.flyout.entityDetails.riskSummary.casesAttachmentLabel', + { + defaultMessage: + 'Risk score for {entityType, select, host {host} user {user}} {entityName}', + values: { + entityName: entityData?.name, + entityType: isUserRiskData(riskData) ? 'user' : 'host', + }, + } + ), + }), + [entityData?.name, riskData] + ); + + const timerange = useMemo(() => { + const from = dateMath.parse(LAST_30_DAYS.from)?.toISOString() ?? LAST_30_DAYS.from; + const to = dateMath.parse(LAST_30_DAYS.to)?.toISOString() ?? LAST_30_DAYS.to; + return { from, to }; + }, []); + return ( ({ expandable: false, }} > - - + +
{riskData && ( @@ -173,7 +201,7 @@ const RiskSummaryComponent = ({ applyGlobalQueriesAndFilters={false} lensAttributes={lensAttributes} id={`RiskSummary-risk_score_metric`} - timerange={LAST_30_DAYS} + timerange={timerange} width={'100%'} height={LENS_VISUALIZATION_HEIGHT} disableOnClickFilter @@ -183,11 +211,17 @@ const RiskSummaryComponent = ({ defaultMessage="Risk Summary Visualization" /> } + casesAttachmentMetadata={casesAttachmentMetadata} /> )}
- +
{ +describe('UsersAssetTable localStorage middleware', () => { beforeEach(() => { - jest.useFakeTimers(); storage.clear(); store = createStore(mockGlobalState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); @@ -33,22 +31,16 @@ describe('UsersAssetTable EpicStorage', () => { // Add field to the table store.dispatch(addUserAssetTableField({ tableId: UserAssetTableType.assetEntra, fieldName })); - await waitFor(() => { - return expect(getUserAssetTableFromStorage(storage)).toEqual({ - [UserAssetTableType.assetEntra]: { fields: [fieldName] }, - }); + expect(getUserAssetTableFromStorage(storage)).toEqual({ + [UserAssetTableType.assetEntra]: { fields: [fieldName] }, }); - jest.runAllTimers(); // pass the time to ensure that the state is persisted to local storage - // Remove field from the table store.dispatch( removeUserAssetTableField({ tableId: UserAssetTableType.assetEntra, fieldName }) ); - await waitFor(() => { - return expect(getUserAssetTableFromStorage(storage)).toEqual({ - [UserAssetTableType.assetEntra]: { fields: [] }, - }); + expect(getUserAssetTableFromStorage(storage)).toEqual({ + [UserAssetTableType.assetEntra]: { fields: [] }, }); }); }); diff --git a/x-pack/plugins/security_solution/public/explore/users/store/epic_storage.ts b/x-pack/plugins/security_solution/public/explore/users/store/middleware_storage.ts similarity index 51% rename from x-pack/plugins/security_solution/public/explore/users/store/epic_storage.ts rename to x-pack/plugins/security_solution/public/explore/users/store/middleware_storage.ts index 97935588cd844..80cbd1e43f79a 100644 --- a/x-pack/plugins/security_solution/public/explore/users/store/epic_storage.ts +++ b/x-pack/plugins/security_solution/public/explore/users/store/middleware_storage.ts @@ -5,34 +5,34 @@ * 2.0. */ -import type { Action } from 'redux'; -import { map, filter, ignoreElements, tap, withLatestFrom, delay } from 'rxjs/operators'; -import type { Epic } from 'redux-observable'; +import type { Action, Middleware } from 'redux'; import { get } from 'lodash/fp'; -import type { RootEpicDependencies } from '../../../common/store/epic'; +import type { Storage } from '@kbn/kibana-utils-plugin/public'; + import { usersActions } from '.'; import { selectUserAssetTables } from './selectors'; import type { UserAssetTableType } from './model'; import type { State } from '../../../common/store/types'; -export const isNotNull = (value: T | null): value is T => value !== null; import { persistUserAssetTableInStorage } from './storage'; const { removeUserAssetTableField, addUserAssetTableField } = usersActions; const tableActionTypes = new Set([removeUserAssetTableField.type, addUserAssetTableField.type]); -export const createUserAssetTableLocalStorageEpic = - (): Epic => - (action$, state$, { storage }) => { - const table$ = state$.pipe(map(selectUserAssetTables), filter(isNotNull)); - return action$.pipe( - delay(500), - withLatestFrom(table$), - tap(([action, tableById]) => { +export const userAssetTableLocalStorageMiddleware: (storage: Storage) => Middleware<{}, State> = + (storage: Storage) => (store) => (next) => (action: Action) => { + // perform the action + const ret = next(action); + + // persist the table state when a table action has been performed + if (tableActionTypes.has(action.type)) { + const tableById = selectUserAssetTables(store.getState()); + const tableId: UserAssetTableType = get('payload.tableId', action); + if (tableById && tableById[tableId] && storage) { if (tableActionTypes.has(action.type)) { - const tableId: UserAssetTableType = get('payload.tableId', action); persistUserAssetTableInStorage(storage, tableId, tableById[tableId]); } - }), - ignoreElements() - ); + } + } + + return ret; }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/cell_actions.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/cell_actions.tsx new file mode 100644 index 0000000000000..214326b990f0f --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/cell_actions.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FC } from 'react'; +import React, { useMemo } from 'react'; +import { useLeftPanelContext } from '../context'; +import { getSourcererScopeId } from '../../../../helpers'; +import { useBasicDataFromDetailsData } from '../../../../timelines/components/side_panel/event_details/helpers'; +import { SecurityCellActionType } from '../../../../actions/constants'; +import { + CellActionsMode, + SecurityCellActions, + SecurityCellActionsTrigger, +} from '../../../../common/components/cell_actions'; + +interface CellActionsProps { + /** + * Field name + */ + field: string; + /** + * Field value + */ + value: string[] | string | null | undefined; + /** + * Boolean to indicate if value is an object array + */ + isObjectArray?: boolean; + /** + * React components to render + */ + children: React.ReactNode | string; +} + +/** + * Security cell action wrapper for document details flyout + */ +export const CellActions: FC = ({ field, value, isObjectArray, children }) => { + const { dataFormattedForFieldBrowser, scopeId, isPreview } = useLeftPanelContext(); + const { isAlert } = useBasicDataFromDetailsData(dataFormattedForFieldBrowser); + + const triggerId = isAlert + ? SecurityCellActionsTrigger.DETAILS_FLYOUT + : SecurityCellActionsTrigger.DEFAULT; + + const data = useMemo(() => ({ field, value }), [field, value]); + const metadata = useMemo(() => ({ scopeId, isObjectArray }), [scopeId, isObjectArray]); + const disabledActionTypes = useMemo( + () => (isPreview ? [SecurityCellActionType.FILTER, SecurityCellActionType.TOGGLE_COLUMN] : []), + [isPreview] + ); + + return ( + + {children} + + ); +}; + +CellActions.displayName = 'CellActions'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx index 2c1a6c27a52d3..aad62c152773a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.test.tsx @@ -67,7 +67,7 @@ describe('CorrelationsDetails', () => { it('renders all sections', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, indices: ['index1'] }); + .mockReturnValue({ show: true, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: true, originalEventId: 'originalEventId' }); @@ -115,7 +115,7 @@ describe('CorrelationsDetails', () => { it('should render no section and show error message if show values are false', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: false, indices: ['index1'] }); + .mockReturnValue({ show: false, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: false, originalEventId: 'originalEventId' }); @@ -144,7 +144,9 @@ describe('CorrelationsDetails', () => { }); it('should render no section if values are null', () => { - jest.mocked(useShowRelatedAlertsByAncestry).mockReturnValue({ show: true }); + jest + .mocked(useShowRelatedAlertsByAncestry) + .mockReturnValue({ show: true, documentId: 'event-id' }); jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: true }); jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: true }); jest.mocked(useShowRelatedCases).mockReturnValue(false); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx index 739a17b7699a8..9d6eb29c3b57f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/correlations_details.tsx @@ -27,13 +27,25 @@ export const CORRELATIONS_TAB_ID = 'correlations-details'; * Correlations displayed in the document details expandable flyout left section under the Insights tab */ export const CorrelationsDetails: React.FC = () => { - const { dataAsNestedObject, dataFormattedForFieldBrowser, eventId, getFieldsData, scopeId } = - useLeftPanelContext(); + const { + dataAsNestedObject, + dataFormattedForFieldBrowser, + eventId, + getFieldsData, + scopeId, + isPreview, + } = useLeftPanelContext(); - const { show: showAlertsByAncestry, indices } = useShowRelatedAlertsByAncestry({ + const { + show: showAlertsByAncestry, + indices, + documentId, + } = useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview, }); const { show: showSameSourceAlerts, originalEventId } = useShowRelatedAlertsBySameSourceEvent({ getFieldsData, @@ -82,9 +94,13 @@ export const CorrelationsDetails: React.FC = () => { )} - {showAlertsByAncestry && indices && ( + {showAlertsByAncestry && documentId && indices && ( - + )} diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx index e8dfa71d0b4c2..bc3105bedaba5 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import type { Anomalies } from '../../../../common/components/ml/types'; +import { LeftPanelContext } from '../context'; import { TestProviders } from '../../../../common/mock'; import { HostDetails } from './host_details'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; @@ -22,6 +23,7 @@ import { } from './test_ids'; import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '../../../shared/components/test_ids'; import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; +import { mockContextValue } from '../mocks/mock_context'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -122,10 +124,12 @@ const mockRelatedUsersResponse = { loading: false, }; -const renderHostDetails = () => +const renderHostDetails = (contextValue: LeftPanelContext) => render( - + + + ); @@ -139,13 +143,13 @@ describe('', () => { }); it('should render host details correctly', () => { - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(HOST_DETAILS_TEST_ID))).toBeInTheDocument(); }); describe('Host overview', () => { it('should render the HostOverview with correct dates and indices', () => { - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(mockUseHostDetails).toBeCalledWith({ id: 'entities-hosts-details-uuid', startDate: from, @@ -164,20 +168,20 @@ describe('', () => { }); mockUseRiskScore.mockReturnValue({ data: [], isAuthorized: true }); - const { getByText } = renderHostDetails(); + const { getByText } = renderHostDetails(mockContextValue); expect(getByText('Host risk score')).toBeInTheDocument(); }); it('should not render host risk score when unauthorized', () => { mockUseRiskScore.mockReturnValue({ data: [], isAuthorized: false }); - const { queryByText } = renderHostDetails(); + const { queryByText } = renderHostDetails(mockContextValue); expect(queryByText('Host risk score')).not.toBeInTheDocument(); }); }); describe('Related users', () => { it('should render the related user table with correct dates and indices', () => { - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(mockUseHostsRelatedUsers).toBeCalledWith({ from: timestamp, hostName: 'test host', @@ -194,7 +198,7 @@ describe('', () => { }); mockUseHasSecurityCapability.mockReturnValue(true); - const { queryAllByRole } = renderHostDetails(); + const { queryAllByRole } = renderHostDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(3); expect(queryAllByRole('row')[1].textContent).toContain('test user'); expect(queryAllByRole('row')[1].textContent).toContain('100.XXX.XXX'); @@ -208,12 +212,12 @@ describe('', () => { }); mockUseHasSecurityCapability.mockReturnValue(false); - const { queryAllByRole } = renderHostDetails(); + const { queryAllByRole } = renderHostDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(2); }); it('should not render host risk score column when license is not valid', () => { - const { queryAllByRole } = renderHostDetails(); + const { queryAllByRole } = renderHostDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(2); }); @@ -224,7 +228,7 @@ describe('', () => { loading: false, }); - const { getByTestId } = renderHostDetails(); + const { getByTestId } = renderHostDetails(mockContextValue); expect(getByTestId(HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID).textContent).toContain( 'No users identified' ); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx index 711eb2a6500f1..bcae491eb2229 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx @@ -21,7 +21,6 @@ import { } from '@elastic/eui'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { getSourcererScopeId } from '../../../../helpers'; import { ExpandablePanel } from '../../../shared/components/expandable_panel'; import type { RelatedUser } from '../../../../../common/search_strategy/security_solution/related_entities/related_users'; import type { RiskSeverity } from '../../../../../common/search_strategy'; @@ -33,11 +32,7 @@ import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { InputsModelId } from '../../../../common/store/inputs/constants'; -import { - SecurityCellActions, - CellActionsMode, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; +import { CellActions } from './cell_actions'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { manageQuery } from '../../../../common/components/page/manage_query'; @@ -135,20 +130,9 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s ), render: (user: string) => ( - + {user} - + ), }, @@ -190,7 +174,7 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s ] : []), ], - [isEntityAnalyticsAuthorized, scopeId] + [isEntityAnalyticsAuthorized] ); const relatedUsersCount = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx index 77e42400001f3..03102e00f753b 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import type { Anomalies } from '../../../../common/components/ml/types'; import { TestProviders } from '../../../../common/mock'; +import { LeftPanelContext } from '../context'; import { UserDetails } from './user_details'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { mockAnomalies } from '../../../../common/components/ml/mock'; @@ -22,6 +23,7 @@ import { } from './test_ids'; import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '../../../shared/components/test_ids'; import { useRiskScore } from '../../../../entity_analytics/api/hooks/use_risk_score'; +import { mockContextValue } from '../mocks/mock_context'; jest.mock('react-router-dom', () => { const actual = jest.requireActual('react-router-dom'); @@ -119,10 +121,12 @@ const mockRelatedHostsResponse = { loading: false, }; -const renderUserDetails = () => +const renderUserDetails = (contextValue: LeftPanelContext) => render( - + + + ); @@ -136,13 +140,13 @@ describe('', () => { }); it('should render host details correctly', () => { - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(USER_DETAILS_TEST_ID))).toBeInTheDocument(); }); describe('Host overview', () => { it('should render the HostOverview with correct dates and indices', () => { - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(mockUseObservedUserDetails).toBeCalledWith({ id: 'entities-users-details-uuid', startDate: from, @@ -159,20 +163,20 @@ describe('', () => { isPlatinumOrTrialLicense: true, capabilities: {}, }); - const { getByText } = renderUserDetails(); + const { getByText } = renderUserDetails(mockContextValue); expect(getByText('User risk score')).toBeInTheDocument(); }); it('should not render user risk score when license is not valid', () => { mockUseRiskScore.mockReturnValue({ data: [], isAuthorized: false }); - const { queryByText } = renderUserDetails(); + const { queryByText } = renderUserDetails(mockContextValue); expect(queryByText('User risk score')).not.toBeInTheDocument(); }); }); describe('Related hosts', () => { it('should render the related host table with correct dates and indices', () => { - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(mockUseUsersRelatedHosts).toBeCalledWith({ from: timestamp, userName: 'test user', @@ -187,7 +191,7 @@ describe('', () => { isPlatinumOrTrialLicense: true, capabilities: {}, }); - const { queryAllByRole } = renderUserDetails(); + const { queryAllByRole } = renderUserDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(3); expect(queryAllByRole('row')[1].textContent).toContain('test host'); expect(queryAllByRole('row')[1].textContent).toContain('100.XXX.XXX'); @@ -195,7 +199,7 @@ describe('', () => { }); it('should not render host risk score column when license is not valid', () => { - const { queryAllByRole } = renderUserDetails(); + const { queryAllByRole } = renderUserDetails(mockContextValue); expect(queryAllByRole('columnheader').length).toBe(2); }); @@ -206,7 +210,7 @@ describe('', () => { loading: false, }); - const { getByTestId } = renderUserDetails(); + const { getByTestId } = renderUserDetails(mockContextValue); expect(getByTestId(USER_DETAILS_RELATED_HOSTS_TABLE_TEST_ID).textContent).toContain( 'No hosts identified' ); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx index 0aa2624f202ff..08c4606b1fa6d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.tsx @@ -21,7 +21,6 @@ import { } from '@elastic/eui'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { getSourcererScopeId } from '../../../../helpers'; import { ExpandablePanel } from '../../../shared/components/expandable_panel'; import type { RelatedHost } from '../../../../../common/search_strategy/security_solution/related_entities/related_hosts'; import type { RiskSeverity } from '../../../../../common/search_strategy'; @@ -32,11 +31,7 @@ import { NetworkDetailsLink } from '../../../../common/components/links'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; -import { - SecurityCellActions, - CellActionsMode, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; +import { CellActions } from './cell_actions'; import { InputsModelId } from '../../../../common/store/inputs/constants'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; @@ -136,20 +131,9 @@ export const UserDetails: React.FC = ({ userName, timestamp, s ), render: (host: string) => ( - + {host} - + ), }, @@ -191,7 +175,7 @@ export const UserDetails: React.FC = ({ userName, timestamp, s ] : []), ], - [isEntityAnalyticsAuthorized, scopeId] + [isEntityAnalyticsAuthorized] ); const relatedHostsCount = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx index eb20cb3e7d495..50b9a5b1643a4 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.test.tsx @@ -59,6 +59,30 @@ describe('', () => { expect(wrapper.getByTestId(ANALYZER_PREVIEW_TEST_ID)).toBeInTheDocument(); }); + it('should use ancestor id when in preview', () => { + mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ + loading: false, + error: false, + alertIds: ['alertid'], + statsNodes: mock.mockStatsNodes, + }); + const contextValue = { + ...mockContextValue, + getFieldsData: () => 'ancestors-id', + dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, + isPreview: true, + }; + + const wrapper = renderAnalyzerPreview(contextValue); + + expect(mockUseAlertPrevalenceFromProcessTree).toHaveBeenCalledWith({ + isActiveTimeline: false, + documentId: 'ancestors-id', + indices: ['rule-indices'], + }); + expect(wrapper.getByTestId(ANALYZER_PREVIEW_TEST_ID)).toBeInTheDocument(); + }); + it('shows error message when index is not present', () => { mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ loading: false, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx index 0beb237f17cf2..5eeac1d9315a8 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview.tsx @@ -11,11 +11,12 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { ANALYZER_PREVIEW_TEST_ID, ANALYZER_PREVIEW_LOADING_TEST_ID } from './test_ids'; import { getTreeNodes } from '../utils/analyzer_helpers'; -import { RULE_INDICES } from '../../shared/constants/field_names'; +import { ANCESTOR_ID, RULE_INDICES } from '../../shared/constants/field_names'; import { useRightPanelContext } from '../context'; import { useAlertPrevalenceFromProcessTree } from '../../../../common/containers/alerts/use_alert_prevalence_from_process_tree'; import type { StatsNode } from '../../../../common/containers/alerts/use_alert_prevalence_from_process_tree'; import { isActiveTimeline } from '../../../../helpers'; +import { getField } from '../../shared/utils'; const CHILD_COUNT_LIMIT = 3; const ANCESTOR_LEVEL = 3; @@ -33,14 +34,23 @@ interface Cache { */ export const AnalyzerPreview: React.FC = () => { const [cache, setCache] = useState>({}); - const { dataFormattedForFieldBrowser: data, scopeId, eventId } = useRightPanelContext(); + const { + dataFormattedForFieldBrowser: data, + getFieldsData, + scopeId, + eventId, + isPreview, + } = useRightPanelContext(); + const ancestorId = getField(getFieldsData(ANCESTOR_ID)) ?? ''; + + const documentId = isPreview ? ancestorId : eventId; // use ancestor as fallback for alert preview const index = find({ category: 'kibana', field: RULE_INDICES }, data); const indices = index?.values ?? []; const { statsNodes, loading, error } = useAlertPrevalenceFromProcessTree({ isActiveTimeline: isActiveTimeline(scopeId), - documentId: eventId, + documentId, indices, }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx index 39429c96b0534..e01713576f5ae 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/assignees.tsx @@ -130,7 +130,7 @@ export const Assignees: FC = memo( {isPreview ? ( getEmptyTagValue() ) : ( - <> + {assignedUsers && ( @@ -159,7 +159,7 @@ export const Assignees: FC = memo( onAssigneesApply={onAssigneesApply} /> - + )} ); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/cell_actions.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/cell_actions.tsx new file mode 100644 index 0000000000000..dde0fb83326a6 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/cell_actions.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FC } from 'react'; +import React, { useMemo } from 'react'; +import { useRightPanelContext } from '../context'; +import { getSourcererScopeId } from '../../../../helpers'; +import { useBasicDataFromDetailsData } from '../../../../timelines/components/side_panel/event_details/helpers'; +import { SecurityCellActionType } from '../../../../actions/constants'; +import { + CellActionsMode, + SecurityCellActions, + SecurityCellActionsTrigger, +} from '../../../../common/components/cell_actions'; + +interface CellActionsProps { + /** + * Field name + */ + field: string; + /** + * Field value + */ + value: string[] | string | null | undefined; + /** + * Boolean to indicate if value is an object array + */ + isObjectArray?: boolean; + /** + * React components to render + */ + children: React.ReactNode | string; +} + +/** + * Security cell action wrapper for document details flyout + */ +export const CellActions: FC = ({ field, value, isObjectArray, children }) => { + const { dataFormattedForFieldBrowser, scopeId, isPreview } = useRightPanelContext(); + const { isAlert } = useBasicDataFromDetailsData(dataFormattedForFieldBrowser); + + const triggerId = isAlert + ? SecurityCellActionsTrigger.DETAILS_FLYOUT + : SecurityCellActionsTrigger.DEFAULT; + + const data = useMemo(() => ({ field, value }), [field, value]); + const metadata = useMemo(() => ({ scopeId, isObjectArray }), [scopeId, isObjectArray]); + const disabledActionTypes = useMemo( + () => (isPreview ? [SecurityCellActionType.FILTER, SecurityCellActionType.TOGGLE_COLUMN] : []), + [isPreview] + ); + + return ( + + {children} + + ); +}; + +CellActions.displayName = 'CellActions'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx index 3a91938ac2f65..531639235bbfb 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.test.tsx @@ -99,7 +99,9 @@ describe('', () => { }); it('should render wrapper component', () => { - jest.mocked(useShowRelatedAlertsByAncestry).mockReturnValue({ show: false }); + jest + .mocked(useShowRelatedAlertsByAncestry) + .mockReturnValue({ show: false, documentId: 'event-id' }); jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: false }); jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: false }); jest.mocked(useShowRelatedCases).mockReturnValue(false); @@ -115,7 +117,7 @@ describe('', () => { it('should show component with all rows in expandable panel', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: true, indices: ['index1'] }); + .mockReturnValue({ show: true, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: true, originalEventId: 'originalEventId' }); @@ -158,7 +160,7 @@ describe('', () => { it('should hide rows and show error message if show values are false', () => { jest .mocked(useShowRelatedAlertsByAncestry) - .mockReturnValue({ show: false, indices: ['index1'] }); + .mockReturnValue({ show: false, documentId: 'event-id', indices: ['index1'] }); jest .mocked(useShowRelatedAlertsBySameSourceEvent) .mockReturnValue({ show: false, originalEventId: 'originalEventId' }); @@ -178,7 +180,9 @@ describe('', () => { }); it('should hide rows if values are null', () => { - jest.mocked(useShowRelatedAlertsByAncestry).mockReturnValue({ show: true }); + jest + .mocked(useShowRelatedAlertsByAncestry) + .mockReturnValue({ show: true, documentId: 'event-id' }); jest.mocked(useShowRelatedAlertsBySameSourceEvent).mockReturnValue({ show: true }); jest.mocked(useShowRelatedAlertsBySession).mockReturnValue({ show: true }); jest.mocked(useShowRelatedCases).mockReturnValue(false); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx index 0bf8639d71ca8..d70094c0e9467 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/correlations_overview.tsx @@ -38,6 +38,7 @@ export const CorrelationsOverview: React.FC = () => { indexName, getFieldsData, scopeId, + isPreview, } = useRightPanelContext(); const { openLeftPanel } = useExpandableFlyoutApi(); @@ -56,10 +57,16 @@ export const CorrelationsOverview: React.FC = () => { }); }, [eventId, openLeftPanel, indexName, scopeId]); - const { show: showAlertsByAncestry, indices } = useShowRelatedAlertsByAncestry({ + const { + show: showAlertsByAncestry, + documentId, + indices, + } = useShowRelatedAlertsByAncestry({ getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview, }); const { show: showSameSourceAlerts, originalEventId } = useShowRelatedAlertsBySameSourceEvent({ getFieldsData, @@ -111,8 +118,8 @@ export const CorrelationsOverview: React.FC = () => { {showAlertsBySession && entityId && ( )} - {showAlertsByAncestry && indices && ( - + {showAlertsByAncestry && documentId && indices && ( + )} ) : ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx index f3a3685d26e70..df6f5fbfc93ce 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/entities_overview.tsx @@ -68,11 +68,13 @@ export const EntitiesOverview: React.FC = () => { {userName || hostName ? ( {userName && ( - - - + <> + + + + + )} - {hostName && ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx index 059de0cc1f736..02f7ac73665ad 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields.tsx @@ -10,17 +10,11 @@ import React, { useMemo } from 'react'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, EuiInMemoryTable, EuiPanel, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { getSourcererScopeId } from '../../../../helpers'; import { convertHighlightedFieldsToTableRow } from '../../shared/utils/highlighted_fields_helpers'; import { useRuleWithFallback } from '../../../../detection_engine/rule_management/logic/use_rule_with_fallback'; import { useBasicDataFromDetailsData } from '../../../../timelines/components/side_panel/event_details/helpers'; import { HighlightedFieldsCell } from './highlighted_fields_cell'; -import { SecurityCellActionType } from '../../../../actions/constants'; -import { - CellActionsMode, - SecurityCellActions, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; +import { CellActions } from './cell_actions'; import { HIGHLIGHTED_FIELDS_DETAILS_TEST_ID, HIGHLIGHTED_FIELDS_TITLE_TEST_ID } from './test_ids'; import { useRightPanelContext } from '../context'; import { useHighlightedFields } from '../../shared/hooks/use_highlighted_fields'; @@ -83,28 +77,13 @@ const columns: Array> = [ scopeId: string; isPreview: boolean; }) => ( - + - + ), }, ]; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx index 9af526a30d42d..d9568de7bf4dc 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx @@ -28,13 +28,14 @@ import { } from '../../../../common/components/first_last_seen/first_last_seen'; import { buildHostNamesFilter, RiskScoreEntity } from '../../../../../common/search_strategy'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { DescriptionListStyled } from '../../../../common/components/page'; import { OverviewDescriptionList } from '../../../../common/components/overview_description_list'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; import { useHostDetails } from '../../../../explore/hosts/containers/hosts/details'; +import { getField } from '../../shared/utils'; +import { CellActions } from './cell_actions'; import { FAMILY, LAST_SEEN, @@ -53,7 +54,6 @@ import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { RiskScoreDocTooltip } from '../../../../overview/components/common'; const HOST_ICON = 'storage'; -const CONTEXT_ID = `flyout-host-entity-overview`; export interface HostEntityOverviewProps { /** @@ -114,21 +114,24 @@ export const HostEntityOverview: React.FC = ({ hostName endDate: to, }); + const hostOSFamilyValue = useMemo( + () => getField(getOr([], 'host.os.family', hostDetails)), + [hostDetails] + ); const hostOSFamily: DescriptionList[] = useMemo( () => [ { title: FAMILY, - description: ( - + description: hostOSFamilyValue ? ( + + {hostOSFamilyValue} + + ) : ( + getEmptyTagValue() ), }, ], - [hostDetails] + [hostOSFamilyValue] ); const hostLastSeen: DescriptionList[] = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx index 710875f7aa971..31295b00c7955 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/severity.tsx @@ -9,10 +9,7 @@ import type { FC } from 'react'; import React, { memo } from 'react'; import { ALERT_SEVERITY } from '@kbn/rule-data-utils'; import type { Severity } from '@kbn/securitysolution-io-ts-alerting-types'; -import { CellActionsMode } from '@kbn/cell-actions'; -import { getSourcererScopeId } from '../../../../helpers'; -import { SecurityCellActions } from '../../../../common/components/cell_actions'; -import { SecurityCellActionsTrigger } from '../../../../actions/constants'; +import { CellActions } from './cell_actions'; import { useRightPanelContext } from '../context'; import { SeverityBadge } from '../../../../common/components/severity_badge'; @@ -23,7 +20,7 @@ const isSeverity = (x: unknown): x is Severity => * Document details severity displayed in flyout right section header */ export const DocumentSeverity: FC = memo(() => { - const { getFieldsData, scopeId } = useRightPanelContext(); + const { getFieldsData } = useRightPanelContext(); const fieldsData = getFieldsData(ALERT_SEVERITY); if (!fieldsData) { @@ -40,19 +37,9 @@ export const DocumentSeverity: FC = memo(() => { } return ( - + - + ); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx index 553dfd5834a0e..a97e009e11556 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/status.tsx @@ -10,10 +10,7 @@ import React, { useMemo } from 'react'; import { find } from 'lodash/fp'; import { FormattedMessage } from '@kbn/i18n-react'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { CellActionsMode } from '@kbn/cell-actions'; import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; -import { getSourcererScopeId } from '../../../../helpers'; -import { SecurityCellActions } from '../../../../common/components/cell_actions'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; import type { EnrichedFieldInfo, @@ -23,7 +20,7 @@ import { SIGNAL_STATUS_FIELD_NAME } from '../../../../timelines/components/timel import { StatusPopoverButton } from '../../../../common/components/event_details/overview/status_popover_button'; import { useRightPanelContext } from '../context'; import { getEnrichedFieldInfo } from '../../../../common/components/event_details/helpers'; -import { SecurityCellActionsTrigger } from '../../../../actions/constants'; +import { CellActions } from './cell_actions'; import { STATUS_TITLE_TEST_ID } from './test_ids'; /** @@ -74,17 +71,7 @@ export const DocumentStatus: FC = () => { {!statusData || !hasData(statusData) || isPreview ? ( getEmptyTagValue() ) : ( - + { scopeId={scopeId} handleOnEventClosed={closeFlyout} /> - + )} diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx index d420992f36949..5293536f54011 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx @@ -23,13 +23,14 @@ import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; import { useRightPanelContext } from '../context'; import type { DescriptionList } from '../../../../../common/utility_types'; +import { getField } from '../../shared/utils'; +import { CellActions } from './cell_actions'; import { FirstLastSeen, FirstLastSeenType, } from '../../../../common/components/first_last_seen/first_last_seen'; import { buildUserNamesFilter, RiskScoreEntity } from '../../../../../common/search_strategy'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; import { DescriptionListStyled } from '../../../../common/components/page'; import { OverviewDescriptionList } from '../../../../common/components/overview_description_list'; import { RiskScoreLevel } from '../../../../entity_analytics/components/severity/common'; @@ -54,7 +55,6 @@ import { useObservedUserDetails } from '../../../../explore/users/containers/use import { RiskScoreDocTooltip } from '../../../../overview/components/common'; const USER_ICON = 'user'; -const CONTEXT_ID = `flyout-user-entity-overview`; export interface UserEntityOverviewProps { /** @@ -113,21 +113,24 @@ export const UserEntityOverview: React.FC = ({ userName timerange, }); + const userDomainValue = useMemo( + () => getField(getOr([], 'user.domain', userDetails)), + [userDetails] + ); const userDomain: DescriptionList[] = useMemo( () => [ { title: USER_DOMAIN, - description: ( - + description: userDomainValue ? ( + + {userDomainValue} + + ) : ( + getEmptyTagValue() ), }, ], - [userDetails] + [userDomainValue] ); const userLastSeen: DescriptionList[] = useMemo( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx index c0083d8f80b2d..cf2b0e98853c9 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/table_tab.tsx @@ -14,12 +14,7 @@ import type { EventFieldsData } from '../../../../common/components/event_detail import { FieldValueCell } from '../../../../common/components/event_details/table/field_value_cell'; import type { BrowserField, BrowserFields } from '../../../../../common/search_strategy'; import { FieldNameCell } from '../../../../common/components/event_details/table/field_name_cell'; -import { - CellActionsMode, - SecurityCellActions, - SecurityCellActionsTrigger, -} from '../../../../common/components/cell_actions'; -import { getSourcererScopeId } from '../../../../helpers'; +import { CellActions } from '../components/cell_actions'; import * as i18n from '../../../../common/components/event_details/translations'; import { useRightPanelContext } from '../context'; import type { ColumnsProvider } from '../../../../common/components/event_details/event_fields_browser'; @@ -68,17 +63,7 @@ export const getColumns: ColumnsProvider = ({ browserFields ); return ( - + - + ); }, }, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx index 8b70fcebdefb7..e0a8f2ddb7ba0 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx @@ -34,7 +34,7 @@ jest.mock( '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver' ); const licenseServiceMock = licenseService as jest.Mocked; - +const eventId = 'event-id'; const dataAsNestedObject = mockDataAsNestedObject; const dataFormattedForFieldBrowser = mockDataFormattedForFieldBrowser; @@ -54,10 +54,16 @@ describe('useShowRelatedAlertsByAncestry', () => { getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview: false, }) ); - expect(hookResult.result.current).toEqual({ show: false, indices: ['rule-parameters-index'] }); + expect(hookResult.result.current).toEqual({ + show: false, + documentId: 'event-id', + indices: ['rule-parameters-index'], + }); }); it(`should return false if feature isn't enabled`, () => { @@ -69,11 +75,14 @@ describe('useShowRelatedAlertsByAncestry', () => { getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview: false, }) ); expect(hookResult.result.current).toEqual({ show: false, + documentId: 'event-id', indices: ['rule-parameters-index'], }); }); @@ -87,11 +96,58 @@ describe('useShowRelatedAlertsByAncestry', () => { getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview: false, }) ); expect(hookResult.result.current).toEqual({ show: false, + documentId: 'event-id', + indices: ['rule-parameters-index'], + }); + }); + + it('should return true and event id as document id by default ', () => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); + (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + licenseServiceMock.isPlatinumPlus.mockReturnValue(true); + const getFieldsData = () => 'ancestors-id'; + hookResult = renderHook(() => + useShowRelatedAlertsByAncestry({ + getFieldsData, + dataAsNestedObject, + dataFormattedForFieldBrowser, + eventId, + isPreview: false, + }) + ); + + expect(hookResult.result.current).toEqual({ + show: true, + documentId: 'event-id', + indices: ['rule-parameters-index'], + }); + }); + + it('should return true and ancestor id as document id if flyout is open in preview', () => { + (useIsExperimentalFeatureEnabled as jest.Mock).mockReturnValue(true); + (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + licenseServiceMock.isPlatinumPlus.mockReturnValue(true); + const getFieldsData = () => 'ancestors-id'; + hookResult = renderHook(() => + useShowRelatedAlertsByAncestry({ + getFieldsData, + dataAsNestedObject, + dataFormattedForFieldBrowser, + eventId, + isPreview: true, + }) + ); + + expect(hookResult.result.current).toEqual({ + show: true, + documentId: 'ancestors-id', indices: ['rule-parameters-index'], }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts index f1627b749bfe1..5a3f9c4f0b657 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.ts @@ -13,7 +13,8 @@ import type { GetFieldsData } from '../../../../common/hooks/use_get_fields_data import { useIsInvestigateInResolverActionEnabled } from '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { useLicense } from '../../../../common/hooks/use_license'; -import { RULE_PARAMETERS_INDEX } from '../constants/field_names'; +import { ANCESTOR_ID, RULE_PARAMETERS_INDEX } from '../constants/field_names'; +import { getField } from '../utils'; export interface UseShowRelatedAlertsByAncestryParams { /** @@ -28,6 +29,14 @@ export interface UseShowRelatedAlertsByAncestryParams { * An array of field objects with category and value */ dataFormattedForFieldBrowser: TimelineEventsDetailsItem[]; + /** + * Id of the event document + */ + eventId: string; + /** + * Boolean indicating if the flyout is open in preview + */ + isPreview: boolean; } export interface UseShowRelatedAlertsByAncestryResult { @@ -39,6 +48,10 @@ export interface UseShowRelatedAlertsByAncestryResult { * Values of the kibana.alert.rule.parameters.index field */ indices?: string[]; + /** + * Value of the document id for fetching ancestry alerts + */ + documentId: string; } /** @@ -48,12 +61,16 @@ export const useShowRelatedAlertsByAncestry = ({ getFieldsData, dataAsNestedObject, dataFormattedForFieldBrowser, + eventId, + isPreview, }: UseShowRelatedAlertsByAncestryParams): UseShowRelatedAlertsByAncestryResult => { const isRelatedAlertsByProcessAncestryEnabled = useIsExperimentalFeatureEnabled( 'insightsRelatedAlertsByProcessAncestry' ); const hasProcessEntityInfo = useIsInvestigateInResolverActionEnabled(dataAsNestedObject); + const ancestorId = getField(getFieldsData(ANCESTOR_ID)) ?? ''; + const documentId = isPreview ? ancestorId : eventId; // can't use getFieldsData here as the kibana.alert.rule.parameters is different and can be nested const originalDocumentIndex = useMemo( () => find({ category: 'kibana', field: RULE_PARAMETERS_INDEX }, dataFormattedForFieldBrowser), @@ -70,6 +87,7 @@ export const useShowRelatedAlertsByAncestry = ({ return { show, + documentId, ...(originalDocumentIndex && originalDocumentIndex.values && { indices: originalDocumentIndex.values }), }; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx new file mode 100644 index 0000000000000..32d4b2f6c2f86 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.test.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TestProviders } from '../../../common/mock'; +import { render } from '@testing-library/react'; +import React from 'react'; +import { UserDetailsPanel } from '.'; +import { EntityDetailsLeftPanelTab } from '../shared/components/left_panel/left_panel_header'; + +describe('LeftPanel', () => { + it('renders', () => { + const { queryByText } = render( + , + { + wrapper: TestProviders, + } + ); + + const tabElement = queryByText('Risk Inputs'); + + expect(tabElement).toBeInTheDocument(); + }); + + it('does not render the tab if tab is not found', () => { + const { queryByText } = render( + , + { + wrapper: TestProviders, + } + ); + + const tabElement = queryByText('Risk Inputs'); + + expect(tabElement).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx index 7cab4350e667c..3a682ba125864 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_details_left/index.tsx @@ -41,6 +41,10 @@ export const UserDetailsPanel = ({ isRiskScoreExist, user, path }: UserDetailsPa if (managedUser.isLoading) return ; + if (!selectedTabId) { + return null; + } + return ( <> { - const defaultTab = tabs[0].id; + const defaultTab = tabs.length > 0 ? tabs[0].id : undefined; if (!path) return defaultTab; return tabs.find((tab) => tab.id === path.tab)?.id ?? defaultTab; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts index 52478e1f38e0c..817eb2715b5b2 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts @@ -1523,4 +1523,26 @@ export const AdvancedPolicySchema: AdvancedPolicySchemaType[] = [ } ), }, + { + key: 'windows.advanced.events.disable_image_load_suppression_cache', + first_supported_version: '8.12.1', + documentation: i18n.translate( + 'xpack.securitySolution.endpoint.policy.advanced.windows.advanced.events.disable_image_load_suppression_cache', + { + defaultMessage: + 'The image load suppression cache improves system performance by enabling Endpoint to tell its kernel driver about DLLs which are un-interesting and will never be evented upon. This feature improves system reponsiveness and reduces Endpoint CPU usage. Use this setting only for troubleshooting if image load events are not being generated as expected. Default: false', + } + ), + }, + { + key: 'windows.advanced.events.disable_registry_write_suppression', + first_supported_version: '8.12.1', + documentation: i18n.translate( + 'xpack.securitySolution.endpoint.policy.advanced.windows.advanced.events.disable_registry_write_suppression', + { + defaultMessage: + 'Registry write suppression improves system performance by enabling Endpoint to tell its driver that certain types of registry operations are uninteresting. Once deemed uninteresting, the driver can quickly drop these events, improving system responsiveness and reducing Endpoint CPU usage. Use this setting only for troubleshooting if registry events are not functioning as expected. Default: false', + } + ), + }, ]; diff --git a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx index b7e0c782a9e6e..97652a97d9897 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx @@ -12,7 +12,6 @@ import { FormattedIp } from '.'; import { TestProviders } from '../../../common/mock'; import { TimelineId, TimelineTabs } from '../../../../common/types/timeline'; import { timelineActions } from '../../store'; -import { activeTimeline } from '../../containers/active_timeline_context'; import { StatefulEventContext } from '../../../common/components/events_viewer/stateful_event_context'; jest.mock('react-redux', () => { @@ -66,15 +65,6 @@ describe('FormattedIp', () => { fieldName: 'host.ip', }; - let toggleExpandedDetail: jest.SpyInstance; - - beforeAll(() => { - toggleExpandedDetail = jest.spyOn(activeTimeline, 'toggleExpandedDetail'); - }); - - afterEach(() => { - toggleExpandedDetail.mockClear(); - }); test('should render ip address', () => { render( @@ -108,7 +98,6 @@ describe('FormattedIp', () => { userEvent.click(screen.getByTestId('network-details')); expect(timelineActions.toggleDetailPanel).not.toHaveBeenCalled(); - expect(toggleExpandedDetail).not.toHaveBeenCalled(); }); test('if enableIpDetailsFlyout, should open NetworkDetailsSidePanel', () => { @@ -137,57 +126,4 @@ describe('FormattedIp', () => { tabType: context.tabType, }); }); - - test('if enableIpDetailsFlyout and timelineId equals to `timeline-1`, should call toggleExpandedDetail', async () => { - const context = { - enableHostDetailsFlyout: true, - enableIpDetailsFlyout: true, - timelineID: TimelineId.active, - tabType: TimelineTabs.query, - }; - render( - - - - - - ); - - userEvent.click(screen.getByTestId('network-details')); - expect(toggleExpandedDetail).toHaveBeenCalledWith({ - panelView: 'networkDetail', - params: { - flowTarget: 'source', - ip: props.value, - }, - }); - }); - - test('if enableIpDetailsFlyout but timelineId not equals to `TimelineId.active`, should not call toggleExpandedDetail', async () => { - const context = { - enableHostDetailsFlyout: true, - enableIpDetailsFlyout: true, - timelineID: TimelineId.test, - tabType: TimelineTabs.query, - }; - render( - - - - - - ); - - userEvent.click(screen.getByTestId('network-details')); - expect(timelineActions.toggleDetailPanel).toHaveBeenCalledWith({ - id: context.timelineID, - panelView: 'networkDetail', - params: { - flowTarget: 'source', - ip: props.value, - }, - tabType: context.tabType, - }); - expect(toggleExpandedDetail).not.toHaveBeenCalled(); - }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx index 9122cfbcad66c..20dcfc89452a3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx @@ -26,8 +26,7 @@ import { parseQueryValue } from '../timeline/body/renderers/parse_query_value'; import type { DataProvider } from '../timeline/data_providers/data_provider'; import { IS_OPERATOR } from '../timeline/data_providers/data_provider'; import { Provider } from '../timeline/data_providers/provider'; -import { TimelineId, TimelineTabs } from '../../../../common/types/timeline'; -import { activeTimeline } from '../../containers/active_timeline_context'; +import type { TimelineTabs } from '../../../../common/types/timeline'; import { NetworkDetailsLink } from '../../../common/components/links'; const getUniqueId = ({ @@ -211,10 +210,6 @@ const AddressLinksItemComponent: React.FC = ({ }) ); } - - if (timelineID === TimelineId.active && tabType === TimelineTabs.query) { - activeTimeline.toggleExpandedDetail({ ...updatedExpandedDetail }); - } } }, [onClick, eventContext, isInTimelineContext, address, fieldName, dispatch] diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx index 45f85294bfa37..9111b641dbc12 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/hooks/use_detail_panel.tsx @@ -15,8 +15,7 @@ import type { FlowTargetSourceDest } from '../../../../../common/search_strategy import { timelineSelectors } from '../../../store'; import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import type { SourcererScopeName } from '../../../../common/store/sourcerer/model'; -import { activeTimeline } from '../../../containers/active_timeline_context'; -import { TimelineTabs, TimelineId } from '../../../../../common/types/timeline'; +import { TimelineTabs } from '../../../../../common/types/timeline'; import { timelineDefaults } from '../../../store/defaults'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; import { DetailsPanel as DetailsPanelComponent } from '..'; @@ -138,16 +137,7 @@ export const useDetailPanel = ({ if (scopedActions) { dispatch(scopedActions.toggleDetailPanel({ tabType, id: scopeId })); } - - if ( - tabType && - expandedDetail[tabType]?.panelView && - scopeId === TimelineId.active && - shouldShowDetailsPanel - ) { - activeTimeline.toggleExpandedDetail({}); - } - }, [scopedActions, tabType, expandedDetail, scopeId, shouldShowDetailsPanel, dispatch]); + }, [scopedActions, tabType, scopeId, dispatch]); const DetailsPanel = useMemo( () => diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts index 1e40f66b70242..5a26600948267 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.test.ts @@ -38,18 +38,28 @@ jest.mock('../../../../../common/hooks/use_space_id', () => ({ useSpaceId: () => 'test-space-id', })); +const mockUseIsExperimentalFeatureEnabled = jest.fn().mockReturnValue(true); + +jest.mock('../../../../../common/hooks/use_experimental_features', () => ({ + useIsExperimentalFeatureEnabled: () => mockUseIsExperimentalFeatureEnabled(), +})); + const mockSearch = jest.fn().mockReturnValue({ data: [], }); +const useSearchStrategyDefaultResponse = { + loading: false, + result: { users: [] }, + search: (...params: unknown[]) => mockSearch(...params), + refetch: () => {}, + inspect: {}, +}; + +const mockUseSearchStrategy = jest.fn().mockReturnValue(useSearchStrategyDefaultResponse); + jest.mock('../../../../../common/containers/use_search_strategy', () => ({ - useSearchStrategy: () => ({ - loading: false, - result: { users: [] }, - search: (...params: unknown[]) => mockSearch(...params), - refetch: () => {}, - inspect: {}, - }), + useSearchStrategy: () => mockUseSearchStrategy(), })); describe('useManagedUser', () => { @@ -108,4 +118,28 @@ describe('useManagedUser', () => { }) ); }); + + it('should not search if the feature is disabled', () => { + mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + renderHook(() => useManagedUser('test-userName', undefined, false), { + wrapper: TestProviders, + }); + + expect(mockSearch).not.toHaveBeenCalled(); + }); + + it('should return loading false when the feature is disabled', () => { + mockUseIsExperimentalFeatureEnabled.mockReturnValue(false); + mockUseInstalledIntegrations.mockReturnValue({ + data: [], + isLoading: true, + }); + mockUseSearchStrategy.mockReturnValue({ ...useSearchStrategyDefaultResponse, loading: true }); + + const { result } = renderHook(() => useManagedUser('test-userName', undefined, false), { + wrapper: TestProviders, + }); + + expect(result.current.isLoading).toBeFalsy(); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts index 6eb7e385ea0b1..2b98529163895 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks/use_managed_user.ts @@ -37,7 +37,7 @@ export const useManagedUser = ( email: string[] | undefined, isLoading?: boolean ): ManagedUserData => { - const skip = useIsExperimentalFeatureEnabled('newUserDetailsFlyoutManagedUser'); + const skip = !useIsExperimentalFeatureEnabled('newUserDetailsFlyoutManagedUser'); const { to, from, isInitializing, deleteQuery, setQuery } = useGlobalTime(); const spaceId = useSpaceId(); const { @@ -95,9 +95,9 @@ export const useManagedUser = ( return useMemo( () => ({ data: managedUserData, - isLoading: loadingManagedUser || loadingIntegrations, + isLoading: skip ? false : loadingManagedUser || loadingIntegrations, isIntegrationEnabled, }), - [isIntegrationEnabled, loadingIntegrations, loadingManagedUser, managedUserData] + [isIntegrationEnabled, loadingIntegrations, loadingManagedUser, managedUserData, skip] ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx index ad8b089adc168..6de3c45fc5786 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user_accordion.tsx @@ -38,6 +38,7 @@ export const ManagedUserAccordion: React.FC = ({ return ( = ({ id: timelineId, }) ); - - if (timelineId === TimelineId.active && tabType === TimelineTabs.query) { - activeTimeline.toggleExpandedDetail({ ...updatedExpandedDetail }); - } }, [dispatch, event._id, event._index, refetch, tabType, timelineId]); const associateNote = useCallback( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx index a4f0a62938038..c865e349c0470 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx @@ -12,7 +12,6 @@ import { HostName } from './host_name'; import { TestProviders } from '../../../../../common/mock'; import { TimelineId, TimelineTabs } from '../../../../../../common/types/timeline'; import { timelineActions } from '../../../../store'; -import { activeTimeline } from '../../../../containers/active_timeline_context'; import { StatefulEventContext } from '../../../../../common/components/events_viewer/stateful_event_context'; import { createTelemetryServiceMock } from '../../../../../common/lib/telemetry/telemetry_service.mock'; @@ -83,15 +82,6 @@ describe('HostName', () => { value: 'Mock Host', }; - let toggleExpandedDetail: jest.SpyInstance; - - beforeAll(() => { - toggleExpandedDetail = jest.spyOn(activeTimeline, 'toggleExpandedDetail'); - }); - - afterEach(() => { - toggleExpandedDetail.mockClear(); - }); test('should render host name', () => { const wrapper = mount( @@ -128,7 +118,6 @@ describe('HostName', () => { wrapper.find('[data-test-subj="host-details-button"]').last().simulate('click'); await waitFor(() => { expect(timelineActions.toggleDetailPanel).not.toHaveBeenCalled(); - expect(toggleExpandedDetail).not.toHaveBeenCalled(); }); }); @@ -160,61 +149,6 @@ describe('HostName', () => { }); }); - test('if enableHostDetailsFlyout and timelineId equals to `timeline-1`, should call toggleExpandedDetail', async () => { - const context = { - enableHostDetailsFlyout: true, - enableIpDetailsFlyout: true, - timelineID: TimelineId.active, - tabType: TimelineTabs.query, - }; - const wrapper = mount( - - - - - - ); - - wrapper.find('[data-test-subj="host-details-button"]').last().simulate('click'); - await waitFor(() => { - expect(toggleExpandedDetail).toHaveBeenCalledWith({ - panelView: 'hostDetail', - params: { - hostName: props.value, - }, - }); - }); - }); - - test('if enableHostDetailsFlyout but timelineId not equals to `TimelineId.active`, should not call toggleExpandedDetail', async () => { - const context = { - enableHostDetailsFlyout: true, - enableIpDetailsFlyout: true, - timelineID: TimelineId.test, - tabType: TimelineTabs.query, - }; - const wrapper = mount( - - - - - - ); - - wrapper.find('[data-test-subj="host-details-button"]').last().simulate('click'); - await waitFor(() => { - expect(timelineActions.toggleDetailPanel).toHaveBeenCalledWith({ - id: context.timelineID, - panelView: 'hostDetail', - params: { - hostName: props.value, - }, - tabType: context.tabType, - }); - expect(toggleExpandedDetail).not.toHaveBeenCalled(); - }); - }); - test('it should open expandable flyout if timeline is not in context and experimental flag is enabled', async () => { mockUseIsExperimentalFeatureEnabled.mockReturnValue(true); const context = { @@ -234,7 +168,6 @@ describe('HostName', () => { wrapper.find('[data-test-subj="host-details-button"]').last().simulate('click'); await waitFor(() => { expect(mockOpenRightPanel).toHaveBeenCalled(); - expect(toggleExpandedDetail).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx index f2e0fc694427a..d57d7ac49bf8a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.tsx @@ -17,11 +17,10 @@ import type { ExpandedDetailType } from '../../../../../../common/types'; import { StatefulEventContext } from '../../../../../common/components/events_viewer/stateful_event_context'; import { getScopedActions, isTimelineScope } from '../../../../../helpers'; import { HostDetailsLink } from '../../../../../common/components/links'; -import { TimelineId, TimelineTabs } from '../../../../../../common/types/timeline'; +import type { TimelineTabs } from '../../../../../../common/types/timeline'; import { DefaultDraggable } from '../../../../../common/components/draggables'; import { getEmptyTagValue } from '../../../../../common/components/empty_value'; import { TruncatableText } from '../../../../../common/components/truncatable_text'; -import { activeTimeline } from '../../../../containers/active_timeline_context'; interface Props { contextId: string; @@ -96,10 +95,6 @@ const HostNameComponent: React.FC = ({ }) ); } - - if (timelineID === TimelineId.active && tabType === TimelineTabs.query) { - activeTimeline.toggleExpandedDetail({ ...updatedExpandedDetail }); - } } } }, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx index 81ab0e35ee213..66ca4a20514e9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.test.tsx @@ -11,7 +11,6 @@ import { waitFor } from '@testing-library/react'; import { TestProviders } from '../../../../../common/mock'; import { TimelineId, TimelineTabs } from '../../../../../../common/types/timeline'; import { timelineActions } from '../../../../store'; -import { activeTimeline } from '../../../../containers/active_timeline_context'; import { UserName } from './user_name'; import { StatefulEventContext } from '../../../../../common/components/events_viewer/stateful_event_context'; import { createTelemetryServiceMock } from '../../../../../common/lib/telemetry/telemetry_service.mock'; @@ -66,15 +65,6 @@ describe('UserName', () => { value: 'Mock User', }; - let toggleExpandedDetail: jest.SpyInstance; - - beforeAll(() => { - toggleExpandedDetail = jest.spyOn(activeTimeline, 'toggleExpandedDetail'); - }); - - afterEach(() => { - toggleExpandedDetail.mockClear(); - }); test('should render user name', () => { const wrapper = mount( @@ -99,33 +89,7 @@ describe('UserName', () => { expect(wrapper.find('[data-test-subj="DefaultDraggable"]').exists()).toEqual(true); }); - test('if timelineId equals to `timeline-1`, should call toggleExpandedDetail', async () => { - const context = { - enableHostDetailsFlyout: true, - enableIpDetailsFlyout: true, - timelineID: TimelineId.active, - tabType: TimelineTabs.query, - }; - const wrapper = mount( - - - - - - ); - - wrapper.find('[data-test-subj="users-link-anchor"]').last().simulate('click'); - await waitFor(() => { - expect(toggleExpandedDetail).toHaveBeenCalledWith({ - panelView: 'userDetail', - params: { - userName: props.value, - }, - }); - }); - }); - - test('if timelineId not equals to `TimelineId.active`, should not call toggleExpandedDetail', async () => { + test('if newUserDetailsFlyout, should open UserDetailsSidePanel', async () => { const context = { enableHostDetailsFlyout: true, enableIpDetailsFlyout: true, @@ -150,7 +114,6 @@ describe('UserName', () => { }, tabType: context.tabType, }); - expect(toggleExpandedDetail).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx index adb224f330661..384b947a2746a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/user_name.tsx @@ -16,12 +16,11 @@ import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use import { StatefulEventContext } from '../../../../../common/components/events_viewer/stateful_event_context'; import type { ExpandedDetailType } from '../../../../../../common/types'; import { getScopedActions, isTimelineScope } from '../../../../../helpers'; -import { TimelineId, TimelineTabs } from '../../../../../../common/types/timeline'; +import type { TimelineTabs } from '../../../../../../common/types/timeline'; import { DefaultDraggable } from '../../../../../common/components/draggables'; import { getEmptyTagValue } from '../../../../../common/components/empty_value'; import { UserDetailsLink } from '../../../../../common/components/links'; import { TruncatableText } from '../../../../../common/components/truncatable_text'; -import { activeTimeline } from '../../../../containers/active_timeline_context'; interface Props { contextId: string; @@ -95,10 +94,6 @@ const UserNameComponent: React.FC = ({ }) ); } - - if (timelineID === TimelineId.active && tabType === TimelineTabs.query) { - activeTimeline.toggleExpandedDetail({ ...updatedExpandedDetail }); - } } } }, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.tsx index f6d5465ab492c..ee803cad8674a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/eql_tab_content/index.tsx @@ -34,7 +34,7 @@ import { Footer, footerHeight } from '../footer'; import { calculateTotalPages } from '../helpers'; import { TimelineRefetch } from '../refetch_timeline'; import type { RowRenderer, ToggleDetailPanel } from '../../../../../common/types/timeline'; -import { TimelineId, TimelineTabs } from '../../../../../common/types/timeline'; +import { TimelineTabs } from '../../../../../common/types/timeline'; import { requiredFieldsForActions } from '../../../../detections/components/alerts_table/default_config'; import { ExitFullScreen } from '../../../../common/components/exit_full_screen'; import { SuperDatePicker } from '../../../../common/components/super_date_picker'; @@ -48,7 +48,6 @@ import { useEqlEventsCountPortal } from '../../../../common/hooks/use_timeline_e import type { TimelineModel } from '../../../store/model'; import { TimelineDatePickerLock } from '../date_picker_lock'; import { useTimelineFullScreen } from '../../../../common/containers/use_full_screen'; -import { activeTimeline } from '../../../containers/active_timeline_context'; import { DetailsPanel } from '../../side_panel'; import { EqlQueryBarTimeline } from '../query_bar/eql'; import { getDefaultControlColumn } from '../body/control_columns'; @@ -213,15 +212,7 @@ export const EqlTabContentComponent: React.FC = ({ const handleOnPanelClosed = useCallback(() => { onEventClosed({ tabType: TimelineTabs.eql, id: timelineId }); - - if ( - expandedDetail[TimelineTabs.eql]?.panelView && - timelineId === TimelineId.active && - showExpandedDetails - ) { - activeTimeline.toggleExpandedDetail({}); - } - }, [onEventClosed, timelineId, expandedDetail, showExpandedDetails]); + }, [onEventClosed, timelineId]); useEffect(() => { dispatch( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx index f1e8b55b7233b..2ae297019e9bb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx @@ -22,7 +22,6 @@ import { FlyoutHeaderPanel } from '../flyout/header'; import type { TimelineId, RowRenderer, TimelineTabs } from '../../../../common/types/timeline'; import { TimelineType } from '../../../../common/api/timeline'; import { useDeepEqualSelector, useShallowEqualSelector } from '../../../common/hooks/use_selector'; -import { activeTimeline } from '../../containers/active_timeline_context'; import { EVENTS_COUNT_BUTTON_CLASS_NAME, onTimelineTabKeyPressed } from './helpers'; import * as i18n from './translations'; import { TabsContent } from './tabs_content'; @@ -116,7 +115,6 @@ const StatefulTimelineComponent: React.FC = ({ columns: defaultHeaders, dataViewId: selectedDataViewIdSourcerer, indexNames: selectedPatternsSourcerer, - expandedDetail: activeTimeline.getExpandedDetail(), show: false, }) ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx index be05ff81f53c2..308ba6038ec5e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.tsx @@ -55,7 +55,6 @@ import { useSourcererDataView } from '../../../../common/containers/sourcerer'; import { useTimelineEventsCountPortal } from '../../../../common/hooks/use_timeline_events_count'; import type { TimelineModel } from '../../../store/model'; import { useTimelineFullScreen } from '../../../../common/containers/use_full_screen'; -import { activeTimeline } from '../../../containers/active_timeline_context'; import { DetailsPanel } from '../../side_panel'; import { ExitFullScreen } from '../../../../common/components/exit_full_screen'; import { getDefaultControlColumn } from '../body/control_columns'; @@ -296,15 +295,7 @@ export const QueryTabContentComponent: React.FC = ({ const handleOnPanelClosed = useCallback(() => { onEventClosed({ tabType: TimelineTabs.query, id: timelineId }); - - if ( - expandedDetail[TimelineTabs.query]?.panelView && - timelineId === TimelineId.active && - showExpandedDetails - ) { - activeTimeline.toggleExpandedDetail({}); - } - }, [onEventClosed, timelineId, expandedDetail, showExpandedDetails]); + }, [onEventClosed, timelineId]); useEffect(() => { dispatch( diff --git a/x-pack/plugins/security_solution/public/timelines/containers/active_timeline_context.ts b/x-pack/plugins/security_solution/public/timelines/containers/active_timeline_context.ts index 383825da33038..350bedb40b196 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/active_timeline_context.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/active_timeline_context.ts @@ -9,8 +9,6 @@ import type { TimelineEventsAllOptionsInput, TimelineEqlRequestOptionsInput, } from '@kbn/timelines-plugin/common'; -import type { ExpandedDetailTimeline, ExpandedDetailType } from '../../../common/types'; -import { TimelineTabs } from '../../../common/types/timeline'; import type { TimelineArgs } from '.'; /* @@ -26,7 +24,6 @@ import type { TimelineArgs } from '.'; class ActiveTimelineEvents { private _activePage: number = 0; - private _expandedDetail: ExpandedDetailTimeline = {}; private _pageName: string = ''; private _request: TimelineEventsAllOptionsInput | null = null; private _response: TimelineArgs | null = null; @@ -41,42 +38,6 @@ class ActiveTimelineEvents { this._activePage = activePage; } - getExpandedDetail() { - return this._expandedDetail; - } - - toggleExpandedDetail(expandedDetail: ExpandedDetailType) { - const queryTab = TimelineTabs.query; - const currentExpandedDetail = this._expandedDetail[queryTab]; - let isSameExpandedDetail; - - // Check if the stored details matches the incoming detail - if (currentExpandedDetail?.panelView === 'eventDetail') { - isSameExpandedDetail = - expandedDetail?.panelView === 'eventDetail' && - expandedDetail?.params?.eventId === currentExpandedDetail?.params?.eventId; - } else if (currentExpandedDetail?.panelView === 'hostDetail') { - isSameExpandedDetail = - expandedDetail?.panelView === 'hostDetail' && - expandedDetail?.params?.hostName === currentExpandedDetail?.params?.hostName; - } else if (currentExpandedDetail?.panelView === 'networkDetail') { - isSameExpandedDetail = - expandedDetail?.panelView === 'networkDetail' && - expandedDetail?.params?.ip === currentExpandedDetail?.params?.ip; - } - - // if so, unset it, otherwise set it - if (isSameExpandedDetail) { - this._expandedDetail = {}; - } else { - this._expandedDetail = { [queryTab]: { ...expandedDetail } }; - } - } - - setExpandedDetail(expandedDetail: ExpandedDetailTimeline) { - this._expandedDetail = expandedDetail; - } - getPageName() { return this._pageName; } diff --git a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx index 81252216c529d..19e8e7b92b870 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx @@ -176,7 +176,6 @@ export const useTimelineEventsHandler = ({ clearSignalsState(); if (id === TimelineId.active) { - activeTimeline.setExpandedDetail({}); activeTimeline.setActivePage(newActivePage); } setActivePage(newActivePage); @@ -245,7 +244,6 @@ export const useTimelineEventsHandler = ({ refreshedAt: Date.now(), }; if (id === TimelineId.active) { - activeTimeline.setExpandedDetail({}); activeTimeline.setPageName(pageName); if (request.language === 'eql') { activeTimeline.setEqlRequest(request as TimelineEqlRequestOptionsInput); diff --git a/x-pack/plugins/security_solution/public/timelines/store/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/helpers.ts index 456d716f529f5..ad26606964601 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/helpers.ts @@ -126,7 +126,6 @@ export const addTimelineToStore = ({ }: AddTimelineParams): TimelineById => { if (shouldResetActiveTimelineContext(id, timelineById[id], timeline)) { activeTimeline.setActivePage(0); - activeTimeline.setExpandedDetail({}); } return { ...timelineById, diff --git a/x-pack/plugins/security_solution/public/timelines/store/epic_changed.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/changed.ts similarity index 70% rename from x-pack/plugins/security_solution/public/timelines/store/epic_changed.ts rename to x-pack/plugins/security_solution/public/timelines/store/middlewares/changed.ts index ed4294207b308..aac6fa71b4467 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/epic_changed.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/changed.ts @@ -5,10 +5,8 @@ * 2.0. */ -import type { Action } from 'redux'; -import type { Epic } from 'redux-observable'; +import type { Action, Middleware } from 'redux'; import { get } from 'lodash/fp'; -import { filter, map } from 'rxjs/operators'; import { applyKqlFilterQuery, @@ -33,7 +31,7 @@ import { setSavedQueryId, setChanged, updateSavedSearch, -} from './actions'; +} from '../actions'; /** * All action types that will mark a timeline as changed @@ -65,19 +63,26 @@ const timelineChangedTypes = new Set([ ]); /** - * Maps actions that mark a timeline change to `setChanged` actions. + * Emit actions that will mark a timeline change to `setChanged` actions. * This allows to detect unsaved timeline changes when navigating away from the timeline. */ -export const createTimelineChangedEpic = (): Epic => (action$) => { - return action$.pipe( - // Only apply mapping to some actions - filter((action) => timelineChangedTypes.has(action.type)), - // Map the action to a `changed` action - map((action) => - setChanged({ - id: get('payload.id', action) as string, - changed: true, - }) - ) - ); -}; +export const timelineChangedMiddleware: Middleware = + ({ dispatch }) => + (next) => + (action: Action) => { + // perform the action + const ret = next(action); + + // if the action matches one of the "change" actions, + // dispatch a `setChanged` action on top + if (timelineChangedTypes.has(action.type)) { + dispatch( + setChanged({ + id: get('payload.id', action) as string, + changed: true, + }) + ); + } + + return ret; + }; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/hosts/flyout_user_panel.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/create_timeline_middlewares.ts similarity index 63% rename from x-pack/test/security_solution_cypress/cypress/screens/hosts/flyout_user_panel.ts rename to x-pack/plugins/security_solution/public/timelines/store/middlewares/create_timeline_middlewares.ts index 170c87349fe45..80f320b755c7e 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/hosts/flyout_user_panel.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/create_timeline_middlewares.ts @@ -5,6 +5,8 @@ * 2.0. */ -import { getDataTestSubjectSelector } from '../../helpers/common'; +import { timelineChangedMiddleware } from './changed'; -export const USER_PANEL_HEADER = getDataTestSubjectSelector('user-panel-header'); +export function createTimelineMiddlewares() { + return [timelineChangedMiddleware]; +} diff --git a/x-pack/plugins/security_solution/public/timelines/store/types.ts b/x-pack/plugins/security_solution/public/timelines/store/types.ts index 741b906dcdebe..fa8a915ddb35d 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/types.ts @@ -6,7 +6,6 @@ */ import type { FilterManager } from '@kbn/data-plugin/public'; -import type { TableById } from '@kbn/securitysolution-data-table'; import type { RootEpicDependencies } from '../../common/store/epic'; import type { ColumnHeaderOptions, SortColumnTimeline } from '../../../common/types'; import type { RowRendererId } from '../../../common/api/timeline'; @@ -41,7 +40,6 @@ export interface TimelineEpicDependencies extends RootEpicDependencies { timelineTimeRangeSelector: (state: State) => inputsModel.TimeRange; selectAllTimelineQuery: () => (state: State, id: string) => inputsModel.GlobalQuery; selectNotesByIdSelector: (state: State) => NotesById; - tableByIdSelector: (state: State) => TableById; } export interface TimelineModelSettings { diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_artifact_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_artifact_services.ts new file mode 100644 index 0000000000000..fda9c7b3ab403 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/endpoint_artifact_services.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 type { ENDPOINT_ARTIFACT_LISTS } from '@kbn/securitysolution-list-constants'; +import { + ENDPOINT_LIST_DESCRIPTION, + ENDPOINT_LIST_ID, + ENDPOINT_LIST_NAME, + EXCEPTION_LIST_ITEM_URL, + INTERNAL_EXCEPTIONS_LIST_ENSURE_CREATED_URL, +} from '@kbn/securitysolution-list-constants'; +import type { KbnClient } from '@kbn/test'; +import type { + CreateExceptionListSchema, + ExceptionListItemSchema, + CreateExceptionListItemSchema, +} from '@kbn/securitysolution-io-ts-list-types'; +import { memoize } from 'lodash'; +import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; +import { catchAxiosErrorFormatAndThrow } from '../../../common/endpoint/format_axios_error'; +import { TRUSTED_APPS_EXCEPTION_LIST_DEFINITION } from '../../../public/management/pages/trusted_apps/constants'; +import { EVENT_FILTER_LIST_DEFINITION } from '../../../public/management/pages/event_filters/constants'; +import { BLOCKLISTS_LIST_DEFINITION } from '../../../public/management/pages/blocklist/constants'; +import { HOST_ISOLATION_EXCEPTIONS_LIST_DEFINITION } from '../../../public/management/pages/host_isolation_exceptions/constants'; +import type { NewTrustedApp } from '../../../common/endpoint/types'; +import { newTrustedAppToCreateExceptionListItem } from '../../../public/management/pages/trusted_apps/service/mappers'; + +const ensureArtifactListExists = memoize( + async ( + kbnClient: KbnClient, + artifactType: keyof typeof ENDPOINT_ARTIFACT_LISTS | 'endpointExceptions' + ) => { + let listDefinition: CreateExceptionListSchema; + + switch (artifactType) { + case 'blocklists': + listDefinition = BLOCKLISTS_LIST_DEFINITION; + break; + + case 'eventFilters': + listDefinition = EVENT_FILTER_LIST_DEFINITION; + break; + + case 'hostIsolationExceptions': + listDefinition = HOST_ISOLATION_EXCEPTIONS_LIST_DEFINITION; + break; + + case 'trustedApps': + listDefinition = TRUSTED_APPS_EXCEPTION_LIST_DEFINITION; + break; + + case 'endpointExceptions': + listDefinition = { + name: ENDPOINT_LIST_NAME, + namespace_type: 'agnostic', + description: ENDPOINT_LIST_DESCRIPTION, + list_id: ENDPOINT_LIST_ID, + type: ExceptionListTypeEnum.ENDPOINT, + }; + + default: + throw new Error(`Unknown Artifact list: ${artifactType}`); + } + + await kbnClient + .request({ + method: 'POST', + path: INTERNAL_EXCEPTIONS_LIST_ENSURE_CREATED_URL, + body: listDefinition, + headers: { + 'elastic-api-version': '1', + }, + }) + .catch(catchAxiosErrorFormatAndThrow); + }, + (kbnClient: KbnClient, artifactType: string) => { + return `${artifactType}@[${kbnClient.resolveUrl('')}`; + } +); + +/** + * Creates an exception list item. + * NOTE: this method does NOT create the list itself. + * + * @private + * + * @param kbnClient + * @param data + */ +const createExceptionListItem = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + return kbnClient + .request({ + method: 'POST', + path: EXCEPTION_LIST_ITEM_URL, + body: data, + headers: { + 'elastic-api-version': '2023-10-31', + }, + }) + .catch(catchAxiosErrorFormatAndThrow) + .then((response) => response.data); +}; + +export const createTrustedApp = async ( + kbnClient: KbnClient, + data: NewTrustedApp +): Promise => { + await ensureArtifactListExists(kbnClient, 'trustedApps'); + return createExceptionListItem(kbnClient, newTrustedAppToCreateExceptionListItem(data)); +}; + +export const createEventFilter = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'eventFilters'); + return createExceptionListItem(kbnClient, data); +}; + +export const createBlocklist = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'blocklists'); + return createExceptionListItem(kbnClient, data); +}; + +export const createHostIsolationException = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'hostIsolationExceptions'); + return createExceptionListItem(kbnClient, data); +}; + +export const createEndpointException = async ( + kbnClient: KbnClient, + data: CreateExceptionListItemSchema +): Promise => { + await ensureArtifactListExists(kbnClient, 'hostIsolationExceptions'); + return createExceptionListItem(kbnClient, data); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/execution_throttler.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/execution_throttler.ts new file mode 100644 index 0000000000000..219c9d577f38c --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/execution_throttler.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable @typescript-eslint/no-explicit-any */ +import type { ToolingLog } from '@kbn/tooling-log'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; + +export interface ExecutionThrottlerOptions { + concurrency?: number; + log?: ToolingLog; +} + +/** + * Queue callback functions and execute them in parallel using the defined concurrency number. Execution of + * callbacks starts as soon as functions start to be added to the queue (ex. Does not wait for a "batch" + * size to be reached) and continues to process the queue until it is flushed out. + */ +export class ExecutionThrottler { + private readonly options: Required; + private readonly queue: Array<() => Promise> = []; + private readonly executing = new Set>(); + + constructor({ concurrency = 10, log = createToolingLogger() }: ExecutionThrottlerOptions = {}) { + this.options = { + concurrency, + log, + }; + } + + private logCurrentState() { + this.options.log.debug( + `Executing count: [${this.executing.size}], Queue count: [${this.queue.length}]` + ); + } + + private async execute(): Promise { + if (this.queue.length === 0) { + return; + } + + while (this.executing.size < this.options.concurrency && this.queue.length) { + const callbackFn = this.queue.shift(); + + if (callbackFn) { + const callbackPromise = callbackFn(); + this.executing.add(callbackPromise); + + callbackPromise.finally(() => { + this.executing.delete(callbackPromise); + this.execute(); + }); + } + } + + this.logCurrentState(); + } + + public addToQueue(fn: () => Promise): void { + this.queue.push(fn); + this.execute(); + } + + public async complete(): Promise { + while (this.executing.size > 0) { + this.logCurrentState(); + await Promise.all(Array.from(this.executing)).catch(() => {}); + } + } + + public getStats(): { pending: number } { + return { + pending: this.queue.length, + }; + } +} diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index b1ff5e8464a00..bd8ed990bac13 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -24,6 +24,7 @@ import type { GetPackagePoliciesResponse, PackagePolicy, PostFleetSetupResponse, + CopyAgentPolicyResponse, } from '@kbn/fleet-plugin/common'; import { AGENT_API_ROUTES, @@ -37,6 +38,7 @@ import { epmRouteService, PACKAGE_POLICY_API_ROUTES, SETUP_API_ROUTE, + PACKAGE_POLICY_SAVED_OBJECT_TYPE, } from '@kbn/fleet-plugin/common'; import type { ToolingLog } from '@kbn/tooling-log'; import type { KbnClient } from '@kbn/test'; @@ -54,6 +56,7 @@ import type { GetEnrollmentAPIKeysResponse, GetOutputsResponse, PostAgentUnenrollResponse, + CopyAgentPolicyRequest, } from '@kbn/fleet-plugin/common/types'; import nodeFetch from 'node-fetch'; import semver from 'semver'; @@ -79,6 +82,14 @@ const DEFAULT_AGENT_POLICY_NAME = `${CURRENT_USERNAME} test policy`; /** A Fleet agent policy that includes integrations that don't actually require an agent to run on a host. Example: SenttinelOne */ export const DEFAULT_AGENTLESS_INTEGRATIONS_AGENT_POLICY_NAME = `${CURRENT_USERNAME} - agentless integrations`; +const randomAgentPolicyName = (() => { + let counter = fleetGenerator.randomN(100); + + return (): string => { + return `agent policy - ${fleetGenerator.randomString(10)}_${counter++}`; + }; +})(); + export const checkInFleetAgent = async ( esClient: Client, agentId: string, @@ -753,6 +764,41 @@ export const enrollHostVmWithFleet = async ({ return waitForHostToEnroll(kbnClient, log, hostVm.name, timeoutMs); }; +interface CreateAgentPolicyOptions { + kbnClient: KbnClient; + policy?: CreateAgentPolicyRequest['body']; +} + +/** + * Create a new Agent Policy in fleet + * @param kbnClient + * @param log + * @param policy + */ +export const createAgentPolicy = async ({ + kbnClient, + policy, +}: CreateAgentPolicyOptions): Promise => { + const body: CreateAgentPolicyRequest['body'] = policy ?? { + name: randomAgentPolicyName(), + description: `Policy created by security solution tooling: ${__filename}`, + namespace: 'default', + monitoring_enabled: ['logs', 'metrics'], + }; + + return kbnClient + .request({ + path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + method: 'POST', + body, + }) + .then((response) => response.data.item) + .catch(catchAxiosErrorFormatAndThrow); +}; + interface GetOrCreateDefaultAgentPolicyOptions { kbnClient: KbnClient; log: ToolingLog; @@ -784,24 +830,15 @@ export const getOrCreateDefaultAgentPolicy = async ({ log.info(`Creating default test/dev Fleet agent policy with name: [${policyName}]`); - const newAgentPolicyData: CreateAgentPolicyRequest['body'] = { - name: policyName, - description: `Policy created by security solution tooling: ${__filename}`, - namespace: 'default', - monitoring_enabled: ['logs', 'metrics'], - }; - - const newAgentPolicy = await kbnClient - .request({ - path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, - headers: { - 'elastic-api-version': API_VERSIONS.public.v1, - }, - method: 'POST', - body: newAgentPolicyData, - }) - .then((response) => response.data.item) - .catch(catchAxiosErrorFormatAndThrow); + const newAgentPolicy = await createAgentPolicy({ + kbnClient, + policy: { + name: policyName, + description: `Policy created by security solution tooling: ${__filename}`, + namespace: 'default', + monitoring_enabled: ['logs', 'metrics'], + }, + }); log.verbose(newAgentPolicy); @@ -1182,6 +1219,40 @@ export const addEndpointIntegrationToAgentPolicy = async ({ return newIntegrationPolicy; }; +type CopyAgentPolicyOptions = Partial & { + kbnClient: KbnClient; + agentPolicyId: string; +}; + +/** + * Copy (clone) a Fleet Agent Policy + * @param kbnClient + * @param agentPolicyId + * @param name + * @param description + */ +export const copyAgentPolicy = async ({ + kbnClient, + agentPolicyId, + name = randomAgentPolicyName(), + description, +}: CopyAgentPolicyOptions) => { + return kbnClient + .request({ + path: agentPolicyRouteService.getCopyPath(agentPolicyId), + headers: { + 'elastic-api-version': API_VERSIONS.public.v1, + }, + method: 'POST', + body: { + name, + description, + }, + }) + .then((response) => response.data.item) + .catch(catchAxiosErrorFormatAndThrow); +}; + /** * Calls the fleet setup API to ensure fleet configured with default settings * @param kbnClient @@ -1205,3 +1276,45 @@ export const ensureFleetSetup = memoize( return setupResponse.data; } ); + +/** + * Fetches a list of Endpoint Integration policies from fleet + * @param kbnClient + * @param kuery + * @param options + */ +export const fetchEndpointIntegrationPolicyList = async ( + kbnClient: KbnClient, + { kuery, ...options }: GetPackagePoliciesRequest['query'] = {} +) => { + const endpointPackageMatchValue = `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: endpoint`; + + return fetchIntegrationPolicyList(kbnClient, { + ...options, + kuery: kuery ? `${kuery} AND ${endpointPackageMatchValue}` : endpointPackageMatchValue, + }); +}; + +/** + * Retrieves all Endpoint Integration policy IDs - but only up to 10k + * @param kbnClient + */ +export const fetchAllEndpointIntegrationPolicyListIds = async ( + kbnClient: KbnClient +): Promise => { + const perPage = 1000; + const policyIds = []; + let hasMoreData = true; + + do { + const result = await fetchEndpointIntegrationPolicyList(kbnClient, { perPage }); + policyIds.push(...result.items.map((policy) => policy.id)); + + // If no more results or the next page of content goes over 10k, then end loop here. + if (!result.items.length || policyIds.length + perPage < 10000) { + hasMoreData = false; + } + } while (hasMoreData); + + return policyIds; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile b/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile index 31819889f38e0..59c5bf12a1627 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/vagrant/Vagrantfile @@ -33,6 +33,5 @@ Vagrant.configure("2") do |config| config.vm.provision "shell", inline: "mkdir #{agentDestinationFolder}" config.vm.provision "shell", inline: "tar -zxf #{cachedAgentFilename} --directory #{agentDestinationFolder} --strip-components=1 && rm -f #{cachedAgentFilename}" config.vm.provision "shell", inline: "sudo apt-get update" - config.vm.provision "shell", inline: "sudo apt-get upgrade" config.vm.provision "shell", inline: "sudo apt-get install unzip" end diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/index.ts new file mode 100644 index 0000000000000..4de4929b8c4c2 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/index.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { run } from '@kbn/dev-cli-runner'; +import { HORIZONTAL_LINE } from '../common/constants'; +import { createKbnClient } from '../common/stack_services'; +import { load } from './src/load'; +import { createToolingLogger } from '../../../common/endpoint/data_loaders/utils'; + +export const cli = () => { + run( + async (cliContext) => { + createToolingLogger.setDefaultLogLevelFromCliFlags(cliContext.flags); + + const log = cliContext.log; + const kbnClient = createKbnClient({ + log, + url: cliContext.flags.kibana as string, + username: cliContext.flags.username as string, + password: cliContext.flags.password as string, + noCertForSsl: true, + }); + + const options = { + policyCount: Number(cliContext.flags.policyCount), + trustedAppsCount: Number(cliContext.flags.trustedAppsCount), + eventFiltersCount: Number(cliContext.flags.eventFiltersCount), + blocklistsCount: Number(cliContext.flags.blocklistsCount), + hostIsolationExceptionsCount: Number(cliContext.flags.hostIsolationExceptionsCount), + endpointExceptionsCount: Number(cliContext.flags.endpointExceptionsCount), + globalArtifactRatio: Number(cliContext.flags.globalArtifactRatio), + concurrency: Number(cliContext.flags.concurrency), + }; + + log.info(`${HORIZONTAL_LINE} + Environment Data Loader +${HORIZONTAL_LINE} +`); + log.info(`Loading data to: ${kbnClient.resolveUrl('')}`); + + await load({ + kbnClient, + log, + ...options, + }); + }, + + // Options + { + description: `Loads data into a environment for testing/development`, + flags: { + string: ['kibana', 'username', 'password'], + default: { + kibana: 'http://127.0.0.1:5601', + username: 'elastic', + password: 'changeme', + policyCount: 10, + trustedAppsCount: 10, + eventFiltersCount: 10, + blocklistsCount: 10, + hostIsolationExceptionsCount: 10, + endpointExceptionsCount: 10, + globalArtifactRatio: 50, + concurrency: 10, + }, + allowUnexpected: false, + help: ` + --username User name to be used for auth against elasticsearch and + kibana (Default: elastic). + --password User name Password (Default: changeme) + --kibana The url to Kibana (Default: http://127.0.0.1:5601) + --policyCount How many policies to create (Default: 10) + --trustedAppsCount How many Trusted Applications to create (Default: 10) + --eventFiltersCount How many Event Filters to create (Default: 10) + --blocklistsCount How many Blocklists to create (Default: 10) + --hostIsolationExceptionsCount How many Host Isolation Exceptions to create (Default: 10) + --endpointExceptionsCount How many Endpoint Exceptions to create (Default: 10) + --globalArtifactRatio The percentage ratio of all artifacts that should be global + rather than per-policy. (Default: 50) + --concurrency The max number of request to process in parallel. (Default: 10) + `, + }, + } + ); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_artifacts.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_artifacts.ts new file mode 100644 index 0000000000000..234c884f58c65 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_artifacts.ts @@ -0,0 +1,296 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { KbnClient } from '@kbn/test'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { BaseDataGenerator } from '../../../../common/endpoint/data_generators/base_data_generator'; +import type { NewTrustedApp } from '../../../../common/endpoint/types'; +import { stringify } from '../../../../server/endpoint/utils/stringify'; +import { EndpointExceptionsGenerator } from '../../../../common/endpoint/data_generators/endpoint_exceptions_generator'; +import { + BY_POLICY_ARTIFACT_TAG_PREFIX, + GLOBAL_ARTIFACT_TAG, +} from '../../../../common/endpoint/service/artifacts'; +import { ExceptionsListItemGenerator } from '../../../../common/endpoint/data_generators/exceptions_list_item_generator'; +import type { ExecutionThrottler } from '../../common/execution_throttler'; +import { EventFiltersGenerator } from '../../../../common/endpoint/data_generators/event_filters_generator'; +import { TrustedAppGenerator } from '../../../../common/endpoint/data_generators/trusted_app_generator'; +import { + createBlocklist, + createEventFilter, + createHostIsolationException, + createTrustedApp, +} from '../../common/endpoint_artifact_services'; +import type { ReportProgressCallback } from './types'; +import { loop } from './utils'; + +interface ArtifactCreationOptions { + kbnClient: KbnClient; + log: ToolingLog; + count: number; + policyIds: string[]; + reportProgress: ReportProgressCallback; + globalArtifactRatio: number; + throttler: ExecutionThrottler; +} + +// Class instance that exposes protected methods for use locally in this module +const gen = new (class extends BaseDataGenerator { + public randomArray(lengthLimit: number, generator: () => T): T[] { + return super.randomArray(lengthLimit, generator); + } + + public randomChoice(choices: T[] | readonly T[]): T { + return super.randomChoice(choices); + } +})(); + +const generatePerPolicyEffectiveScope = (policyIds: string[]): string[] => { + return gen.randomArray( + gen.randomN(Math.min(100, policyIds.length)), + () => `${BY_POLICY_ARTIFACT_TAG_PREFIX}${gen.randomChoice(policyIds)}` + ); +}; + +const logError = (log: ToolingLog, artifactType: string, error: Error) => { + log.error(`[${artifactType}] error: ${error.message}`); + log.verbose(stringify(error)); +}; + +const calculateGlobalAndPerPolicyCounts = ( + total: number, + globalRatio: number +): { global: number; perPolicy: number } => { + const response = { + global: 0, + perPolicy: 0, + }; + + response.global = Math.floor(total * (globalRatio / 100)); + + // If a ratio was defined, then ensure at least one is created + if (globalRatio > 0 && response.global === 0) { + response.global = 1; + } + + response.perPolicy = total - response.global; + + return response; +}; + +export const createTrustedApps = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + globalArtifactRatio, + policyIds, +}: ArtifactCreationOptions): Promise => { + const generator = new TrustedAppGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info(`Trusted Apps: Creating ${globalCount} global and ${perPolicy} per-policy artifacts`); + + loop(count, () => { + throttler.addToQueue(async () => { + let effectScope: NewTrustedApp['effectScope'] = { type: 'global' }; + + if (globalDone < globalCount) { + globalDone++; + } else { + effectScope = { + type: 'policy', + policies: gen.randomArray(gen.randomN(Math.min(100, policyIds.length)), () => + gen.randomChoice(policyIds) + ), + }; + } + + await createTrustedApp( + kbnClient, + generator.generateTrustedAppForCreate({ + effectScope, + }) + ) + .catch((e) => { + errorCount++; + logError(log, 'Trusted Application', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createEventFilters = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + globalArtifactRatio, + policyIds, +}: ArtifactCreationOptions): Promise => { + const eventGenerator = new EventFiltersGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info(`Event Filters: Creating ${globalCount} global and ${perPolicy} per-policy artifacts`); + + loop(count, () => { + throttler.addToQueue(async () => { + let tags = [GLOBAL_ARTIFACT_TAG]; + + if (globalDone < globalCount) { + globalDone++; + } else { + tags = generatePerPolicyEffectiveScope(policyIds); + } + + await createEventFilter(kbnClient, eventGenerator.generateEventFilterForCreate({ tags })) + .catch((e) => { + errorCount++; + logError(log, 'Event Filter', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createBlocklists = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + policyIds, + globalArtifactRatio, +}: ArtifactCreationOptions): Promise => { + const generate = new ExceptionsListItemGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info(`Blocklists: Creating ${globalCount} global and ${perPolicy} per-policy artifacts`); + + loop(count, () => { + throttler.addToQueue(async () => { + let tags = [GLOBAL_ARTIFACT_TAG]; + + if (globalDone < globalCount) { + globalDone++; + } else { + tags = generatePerPolicyEffectiveScope(policyIds); + } + + await createBlocklist(kbnClient, generate.generateBlocklistForCreate({ tags })) + .catch((e) => { + errorCount++; + logError(log, 'BLocklist', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createHostIsolationExceptions = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, + globalArtifactRatio, + policyIds, +}: ArtifactCreationOptions): Promise => { + const generate = new ExceptionsListItemGenerator(); + const { global: globalCount, perPolicy } = calculateGlobalAndPerPolicyCounts( + count, + globalArtifactRatio + ); + let globalDone = 0; + let doneCount = 0; + let errorCount = 0; + + log.info( + `Host Isolation Exceptions: Creating ${globalCount} global and ${perPolicy} per-policy artifacts` + ); + + loop(count, () => { + throttler.addToQueue(async () => { + let tags = [GLOBAL_ARTIFACT_TAG]; + + if (globalDone < globalCount) { + globalDone++; + } else { + tags = generatePerPolicyEffectiveScope(policyIds); + } + + await createHostIsolationException( + kbnClient, + generate.generateHostIsolationExceptionForCreate({ tags }) + ) + .catch((e) => { + errorCount++; + logError(log, 'Host Isolation Exception', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; + +export const createEndpointExceptions = async ({ + kbnClient, + log, + count, + reportProgress, + throttler, +}: ArtifactCreationOptions): Promise => { + const generate = new EndpointExceptionsGenerator(); + let doneCount = 0; + let errorCount = 0; + + loop(count, () => { + throttler.addToQueue(async () => { + await createHostIsolationException(kbnClient, generate.generateEndpointExceptionForCreate()) + .catch((e) => { + errorCount++; + logError(log, 'Endpoint Exception', e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount }); + }); + }); + }); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_policies.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_policies.ts new file mode 100644 index 0000000000000..7be6fc345af5a --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/create_policies.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { KbnClient } from '@kbn/test'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { loop } from './utils'; +import type { ExecutionThrottler } from '../../common/execution_throttler'; +import { + addEndpointIntegrationToAgentPolicy, + copyAgentPolicy, + createAgentPolicy, +} from '../../common/fleet_services'; +import type { ReportProgressCallback } from './types'; + +interface CreatePoliciesOptions { + kbnClient: KbnClient; + log: ToolingLog; + count: number; + reportProgress: ReportProgressCallback; + throttler: ExecutionThrottler; +} + +export const createPolicies = async ({ + kbnClient, + count, + reportProgress, + log, + throttler, +}: CreatePoliciesOptions): Promise => { + const endpointIntegrationPolicyIds: string[] = []; + const errors: Error[] = []; + let doneCount = 0; + + log.verbose(`creating [${count}] policies in fleet`); + + // Create first policy with endpoint + const agentPolicyId = (await createAgentPolicy({ kbnClient })).id; + const endpointPolicy = await addEndpointIntegrationToAgentPolicy({ + kbnClient, + log, + agentPolicyId, + name: `endpoint protect policy (${Math.random().toString(32).substring(2)})`, + }); + + endpointIntegrationPolicyIds.push(endpointPolicy.id); + doneCount++; + reportProgress({ doneCount, errorCount: errors.length }); + + // TODO:PT maybe use ES bulk create and bypass fleet so that we speed this up? + + loop(count - 1, () => { + throttler.addToQueue(async () => { + await copyAgentPolicy({ kbnClient, agentPolicyId }) + .then((response) => { + if (response.package_policies?.[0]) { + endpointIntegrationPolicyIds.push(response.package_policies[0].id); + } else { + errors.push( + new Error( + `Copy of agent policy [${agentPolicyId}] did not copy the Endpoint Integration!` + ) + ); + } + }) + .catch((e) => { + errors.push(e); + }) + .finally(() => { + doneCount++; + reportProgress({ doneCount, errorCount: errors.length }); + }); + }); + }); + + await throttler.complete(); + + if (errors.length) { + log.error( + `${errors.length} errors encountered while trying to create policies. First error: ${errors[0].message}` + ); + log.verbose(...errors); + } + + return endpointIntegrationPolicyIds; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/load.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/load.ts new file mode 100644 index 0000000000000..066aacc97742c --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/load.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 type { ToolingLog } from '@kbn/tooling-log'; +import type { KbnClient } from '@kbn/test'; +import { fetchAllEndpointIntegrationPolicyListIds } from '../../common/fleet_services'; +import { ExecutionThrottler } from '../../common/execution_throttler'; +import { + createBlocklists, + createEndpointExceptions, + createEventFilters, + createHostIsolationExceptions, + createTrustedApps, +} from './create_artifacts'; +import { installOrUpgradeEndpointFleetPackage } from '../../../../common/endpoint/data_loaders/setup_fleet_for_endpoint'; +import { ProgressReporter } from './progress_reporter'; +import type { ProgressReporterInterface } from './types'; +import { createPolicies } from './create_policies'; +import { createToolingLogger } from '../../../../common/endpoint/data_loaders/utils'; + +interface LoadOptions { + kbnClient: KbnClient; + log?: ToolingLog; + policyCount: number; + trustedAppsCount: number; + eventFiltersCount: number; + blocklistsCount: number; + hostIsolationExceptionsCount: number; + endpointExceptionsCount: number; + globalArtifactRatio: number; + concurrency: number; +} + +export const load = async ({ + kbnClient, + log = createToolingLogger(), + policyCount, + trustedAppsCount, + eventFiltersCount, + blocklistsCount, + hostIsolationExceptionsCount, + endpointExceptionsCount, + globalArtifactRatio, + concurrency, +}: LoadOptions) => { + const throttler = new ExecutionThrottler({ log, concurrency }); + const reportProgress: ProgressReporterInterface = new ProgressReporter({ + reportStatus: (status) => { + const now = new Date(); + + log.info(`__ +Status at: ${now.toString()} +${status}\nRequests pending: ${throttler.getStats().pending} + +`); + }, + }); + const policyReporter = reportProgress.addCategory('policies', policyCount); + const trustedAppsReporter = reportProgress.addCategory('trusted apps', trustedAppsCount); + const eventFiltersReporter = reportProgress.addCategory('event filters', eventFiltersCount); + const blocklistsReporter = reportProgress.addCategory('blocklists', blocklistsCount); + const hostIsolationExceptionsReporter = reportProgress.addCategory( + 'host isolation exceptions', + hostIsolationExceptionsCount + ); + const endpointExceptionsReporter = reportProgress.addCategory( + 'endpoint exceptions', + endpointExceptionsCount + ); + + // Ensure fleet is setup with endpoint (which also creates the DS/Transforms, etc) + await installOrUpgradeEndpointFleetPackage(kbnClient, log); + + const endpointPolicyIds = policyCount + ? await createPolicies({ + kbnClient, + log, + count: policyCount, + reportProgress: policyReporter, + throttler, + }) + : await fetchAllEndpointIntegrationPolicyListIds(kbnClient); + + log?.verbose(`Policy IDs:\n${endpointPolicyIds.join('\n')}`); + + await Promise.all([ + trustedAppsCount && + createTrustedApps({ + kbnClient, + log, + reportProgress: trustedAppsReporter, + count: trustedAppsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + eventFiltersCount && + createEventFilters({ + kbnClient, + log, + reportProgress: eventFiltersReporter, + count: eventFiltersCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + blocklistsCount && + createBlocklists({ + kbnClient, + log, + reportProgress: blocklistsReporter, + count: blocklistsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + hostIsolationExceptionsCount && + createHostIsolationExceptions({ + kbnClient, + log, + reportProgress: hostIsolationExceptionsReporter, + count: hostIsolationExceptionsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + + endpointExceptionsCount && + createEndpointExceptions({ + kbnClient, + log, + reportProgress: endpointExceptionsReporter, + count: endpointExceptionsCount, + policyIds: endpointPolicyIds, + globalArtifactRatio, + throttler, + }), + ]); + + await throttler.complete(); + reportProgress.stopReporting(); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/progress_reporter.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/progress_reporter.ts new file mode 100644 index 0000000000000..cc26321047979 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/progress_reporter.ts @@ -0,0 +1,181 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { once } from 'lodash'; +import { HORIZONTAL_LINE } from '../../common/constants'; +import { getElapsedTime } from '../../../../common/endpoint/data_loaders/utils'; +import type { + ProgressReporterInterface, + ProgressReporterState, + ReportProgressCallback, +} from './types'; + +const NOOP = () => {}; + +interface ProgressReporterOptions { + /** + * If defined, this callback to be used in reporting status on an interval until + * the `doneCount` reaches the `totalCount` of all categories + * @param status + */ + reportStatus?: (status: string) => void; +} + +export class ProgressReporter implements ProgressReporterInterface { + private readonly reportIntervalMs = 20000; + private readonly startedAt: Date = new Date(); + private categories: Record< + string, + { totalCount: number; doneCount: number; errorCount: number } + > = {}; + private stopReportingLoop: () => void = NOOP; + + constructor(private readonly options: ProgressReporterOptions = {}) { + if (options.reportStatus) { + this.startReporting(); + } + } + + public startReporting() { + this.stopReportingLoop(); + + if (!this.options.reportStatus) { + return; + } + + const setIntId = setInterval(() => { + if (this.options.reportStatus) { + this.options.reportStatus(this.getStatus()); + + if (this.getState().prctDone === 100) { + this.stopReportingLoop(); + } + } + }, this.reportIntervalMs); + + const exitEvCallback = () => this.stopReportingLoop(); + + this.stopReportingLoop = once(() => { + clearInterval(setIntId); + process.off('exit', exitEvCallback); + }); + + process.on('exit', exitEvCallback); + } + + stopReporting() { + this.stopReportingLoop(); + + if (this.options.reportStatus) { + this.options.reportStatus(this.getStatus()); + } + } + + addCategory(name: string, totalCount: number): ReportProgressCallback { + this.categories[name] = { + totalCount, + doneCount: 0, + errorCount: 0, + }; + + this.startReporting(); + return this.getReporter(name); + } + + getReporter(categoryName: string): ReportProgressCallback { + if (!this.categories[categoryName]) { + throw new Error(`category name [${categoryName}] has not known`); + } + + return (options) => { + this.categories[categoryName].doneCount = options.doneCount; + }; + } + + getState(): ProgressReporterState { + const state: ProgressReporterState = { + prctDone: 0, + totalCount: 0, + doneCount: 0, + errorCount: 0, + categories: {}, + }; + + Object.entries(this.categories).forEach( + ([ + categoryName, + { + totalCount: thisCategoryTotalCount, + doneCount: thisCategoryDoneCount, + errorCount: thisCategoryErrorCount, + }, + ]) => { + state.totalCount += thisCategoryTotalCount; + state.doneCount += thisCategoryDoneCount; + state.errorCount += thisCategoryErrorCount; + + state.categories[categoryName] = { + totalCount: thisCategoryTotalCount, + doneCount: thisCategoryDoneCount, + errorCount: thisCategoryErrorCount, + prctDone: calculatePercentage(thisCategoryTotalCount, thisCategoryDoneCount), + }; + } + ); + + state.prctDone = calculatePercentage(state.totalCount, state.doneCount); + + return state; + } + + getStatus(): string { + const state = this.getState(); + const categoryNamesMaxChr = + Object.keys(state.categories).reduce((acc, categoryName) => { + return Math.max(acc, categoryName.length); + }, 10) + 4; + + return `${HORIZONTAL_LINE} +${'Overall Progress: '.padEnd(categoryNamesMaxChr + 4)}${state.prctDone}% +${HORIZONTAL_LINE} +${ + 'Elapsed Time (hh:mm:ss.ms):'.padEnd(categoryNamesMaxChr + 4) + + getElapsedTime(this.getStartedTime()) +} +${'Error Count:'.padEnd(categoryNamesMaxChr + 4) + state.errorCount} +Details: + ${Object.entries(state.categories).reduce((acc, [categoryName, categoryState]) => { + let updatedOutput = acc; + + if (updatedOutput.length) { + updatedOutput += `\n `; + } + + updatedOutput += `${`${`${categoryName}:` + .concat(' '.repeat(categoryNamesMaxChr)) + .substring(0, categoryNamesMaxChr)} ${categoryState.prctDone}%`.padEnd( + categoryNamesMaxChr + 10 + )}(${categoryState.doneCount} / ${categoryState.totalCount}, ${ + categoryState.errorCount + } errors)`; + + return updatedOutput; + }, '')}`; + } + + getStartedTime(): Date { + return new Date(this.startedAt); + } +} + +const calculatePercentage = (totalCount: number, doneCount: number): number => { + if (totalCount <= 0 || doneCount <= 0) { + return 0; + } + + return Math.min(100, Number(((doneCount / totalCount) * 100).toPrecision(3))); +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/types.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/types.ts new file mode 100644 index 0000000000000..ad2be28fdf573 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/types.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type ReportProgressCallback = (options: { doneCount: number; errorCount: number }) => void; + +interface ProgressReporterStateProperties { + prctDone: number; + totalCount: number; + doneCount: number; + errorCount: number; +} + +export interface ProgressReporterState extends ProgressReporterStateProperties { + categories: Record; +} + +export interface ProgressReporterInterface { + addCategory(name: string, totalCount: number): ReportProgressCallback; + + getReporter(categoryName: string): ReportProgressCallback; + + getState(): ProgressReporterState; + + getStatus(): string; + + getStartedTime(): Date; + + startReporting(): void; + + stopReporting(): void; +} diff --git a/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/utils.ts b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/utils.ts new file mode 100644 index 0000000000000..5993849e97583 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/env_data_loader/src/utils.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const loop = (count: number, callback: (instance: number) => any): void => { + let done = 1; + + while (done <= count) { + try { + callback(done++); + } catch { + return; + } + } +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/load_env_data.js b/x-pack/plugins/security_solution/scripts/endpoint/load_env_data.js new file mode 100644 index 0000000000000..6568d3465432f --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/load_env_data.js @@ -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. + */ + +require('../../../../../src/setup_node_env'); +require('./env_data_loader').cli(); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts index 0c573b561479f..6e18765c041cf 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts @@ -298,7 +298,7 @@ function responseActionRequestHandler = ({ co saveConfig={mutate} /> + + + + {i18n.translate( + 'xpack.serverlessSearch.searchConnectors.configurationConnector.config.documentation.link', + { + defaultMessage: 'Documentation', + } + )} + + ), + }} + /> + + ); }; diff --git a/x-pack/plugins/serverless_search/public/navigation_tree.ts b/x-pack/plugins/serverless_search/public/navigation_tree.ts index 02298721841ae..17c00fcf71ae2 100644 --- a/x-pack/plugins/serverless_search/public/navigation_tree.ts +++ b/x-pack/plugins/serverless_search/public/navigation_tree.ts @@ -21,6 +21,14 @@ export const navigationTree: NavigationTreeDefinition = { isCollapsible: false, breadcrumbStatus: 'hidden', children: [ + { + id: 'home', + title: i18n.translate('xpack.serverlessSearch.nav.home', { + defaultMessage: 'Home', + }), + link: 'serverlessElasticsearch', + spaceBefore: 'm', + }, { id: 'dev_tools', title: i18n.translate('xpack.serverlessSearch.nav.devTools', { @@ -30,7 +38,7 @@ export const navigationTree: NavigationTreeDefinition = { getIsActive: ({ pathNameSerialized, prepend }) => { return pathNameSerialized.startsWith(prepend('/app/dev_tools')); }, - spaceBefore: 'l', + spaceBefore: 'm', }, { link: 'discover', diff --git a/x-pack/plugins/synthetics/server/routes/create_route_with_auth.test.ts b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.test.ts new file mode 100644 index 0000000000000..36262e2402b8e --- /dev/null +++ b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createSyntheticsRouteWithAuth } from './create_route_with_auth'; + +describe('createSyntheticsRouteWithAuth', () => { + it('should create a route with auth', () => { + const route = createSyntheticsRouteWithAuth(() => ({ + method: 'GET', + path: '/foo', + validate: {}, + handler: async () => { + return { success: true }; + }, + })); + + expect(route).toEqual({ + method: 'GET', + path: '/foo', + validate: {}, + handler: expect.any(Function), + writeAccess: false, + }); + }); + + it.each([['POST'], ['PUT'], ['DELETE']])( + 'requires write permissions for %s requests', + (method) => { + if (method !== 'POST' && method !== 'PUT' && method !== 'DELETE') + throw Error('Invalid method'); + const route = createSyntheticsRouteWithAuth(() => ({ + method, + path: '/foo', + validate: {}, + handler: async () => { + return { success: true }; + }, + })); + + expect(route).toEqual({ + method, + path: '/foo', + validate: {}, + handler: expect.any(Function), + writeAccess: true, + }); + } + ); + + it.each([['POST'], ['PUT'], ['DELETE']])( + 'allows write access override for %s requests', + (method) => { + if (method !== 'POST' && method !== 'PUT' && method !== 'DELETE') + throw Error('Invalid method'); + const route = createSyntheticsRouteWithAuth(() => ({ + method, + path: '/foo', + validate: {}, + handler: async () => { + return { success: true }; + }, + writeAccessOverride: true, + })); + + expect(route).toEqual({ + method, + path: '/foo', + validate: {}, + handler: expect.any(Function), + writeAccess: undefined, + }); + } + ); +}); diff --git a/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts index af9a308d2ac63..f4fb413011614 100644 --- a/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts +++ b/x-pack/plugins/synthetics/server/routes/create_route_with_auth.ts @@ -13,11 +13,18 @@ import { } from '../../common/constants'; import { SyntheticsRestApiRouteFactory, SyntheticsRoute, SyntheticsRouteHandler } from './types'; +function getWriteAccessFlag(method: string, writeAccessOverride?: boolean, writeAccess?: boolean) { + // if route includes an override, skip write-only access with `undefined` + // otherwise, if route is not a GET, require write access + // if route is get, use writeAccess value with `false` as default + return writeAccessOverride === true ? undefined : method !== 'GET' ? true : writeAccess ?? false; +} + export const createSyntheticsRouteWithAuth = ( routeCreator: SyntheticsRestApiRouteFactory ): SyntheticsRoute => { const restRoute = routeCreator(); - const { handler, method, path, options, ...rest } = restRoute; + const { handler, method, path, options, writeAccess, writeAccessOverride, ...rest } = restRoute; const licenseCheckHandler: SyntheticsRouteHandler = async ({ context, response, @@ -49,6 +56,7 @@ export const createSyntheticsRouteWithAuth = ( options, handler: licenseCheckHandler, ...rest, + writeAccess: getWriteAccessFlag(method, writeAccessOverride, writeAccess), }; }; diff --git a/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts b/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts index 49481a4347a1d..db403bd6bcd54 100644 --- a/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts +++ b/x-pack/plugins/synthetics/server/routes/default_alerts/enable_default_alert.ts @@ -13,7 +13,6 @@ export const enableDefaultAlertingRoute: SyntheticsRestApiRouteFactory = () => ( method: 'POST', path: SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING, validate: {}, - writeAccess: true, handler: async ({ context, server, savedObjectsClient }): Promise => { const defaultAlertService = new DefaultAlertService(context, server, savedObjectsClient); diff --git a/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts b/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts index 765ba5edefb95..bef006d02b87e 100644 --- a/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts +++ b/x-pack/plugins/synthetics/server/routes/default_alerts/update_default_alert.ts @@ -13,7 +13,6 @@ export const updateDefaultAlertingRoute: SyntheticsRestApiRouteFactory = () => ( method: 'PUT', path: SYNTHETICS_API_URLS.ENABLE_DEFAULT_ALERTING, validate: {}, - writeAccess: true, handler: async ({ context, server, savedObjectsClient }): Promise => { const defaultAlertService = new DefaultAlertService(context, server, savedObjectsClient); diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts index 3db44c1a6c0c4..f158ea58b19a3 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts @@ -50,7 +50,6 @@ export const addSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ({ gettingStarted: schema.maybe(schema.boolean()), }), }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response, savedObjectsClient, server } = routeContext; // usually id is auto generated, but this is useful for testing diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts index 1fb924a57a56e..75427a22aced2 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor_project.ts @@ -31,7 +31,6 @@ export const addSyntheticsProjectMonitorRoute: SyntheticsRestApiRouteFactory = ( maxBytes: MAX_PAYLOAD_SIZE, }, }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response, server } = routeContext; const { projectName } = request.params; diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts index 0d5825dbbdd3f..91e08081fbf7d 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts @@ -34,7 +34,6 @@ export const deleteSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => monitorId: schema.string({ minLength: 1, maxLength: 1024 }), }), }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response } = routeContext; const { monitorId } = request.params; diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts index d9e9b918e3fff..8d64c95ab6e8c 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts @@ -42,7 +42,6 @@ export const editSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ( }), body: schema.any(), }, - writeAccess: true, handler: async (routeContext): Promise => { const { request, response, savedObjectsClient, server } = routeContext; const { logger } = server; diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts index 78f445190d2e9..9d9c6d898138b 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/inspect_monitor.ts @@ -25,7 +25,6 @@ export const inspectSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () = hideParams: schema.maybe(schema.boolean()), }), }, - writeAccess: true, handler: async (routeContext): Promise => { const { savedObjectsClient, server, syntheticsMonitorClient, request, spaceId, response } = routeContext; diff --git a/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts b/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts index a8f282330c893..f75a92ea555d8 100644 --- a/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts +++ b/x-pack/plugins/synthetics/server/routes/pings/journey_screenshot_blocks.ts @@ -22,6 +22,7 @@ export const createJourneyScreenshotBlocksRoute: SyntheticsRestApiRouteFactory = hashes: schema.arrayOf(schema.string()), }), }, + writeAccessOverride: true, handler: async (routeProps) => { return await journeyScreenshotBlocksHandler(routeProps); }, diff --git a/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts b/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts index 9e26666ed30d9..a51079f366eff 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/params/add_param.ts @@ -37,7 +37,6 @@ export const addSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< body: schema.oneOf([ParamsObjectSchema, schema.arrayOf(ParamsObjectSchema)]), }, }, - writeAccess: true, handler: async ({ request, response, server, savedObjectsClient }) => { try { const { id: spaceId } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { diff --git a/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts b/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts index f0f377ce82d9e..78d24d9452ae9 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/params/delete_param.ts @@ -27,7 +27,6 @@ export const deleteSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< }), }, }, - writeAccess: true, handler: async ({ savedObjectsClient, request }) => { const { ids } = request.body; diff --git a/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts b/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts index cd1b0731eedb0..3555963b76bf1 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/params/edit_param.ts @@ -38,7 +38,6 @@ export const editSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< }), }, }, - writeAccess: true, handler: async ({ savedObjectsClient, request, server, response }) => { try { const { id: _spaceId } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { diff --git a/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts b/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts index e541ec88ae861..ac6eff7dea90d 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/private_locations/add_private_location.ts @@ -40,7 +40,6 @@ export const addPrivateLocationRoute: SyntheticsRestApiRouteFactory { const location = request.body as PrivateLocationObject; diff --git a/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts b/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts index 75dd92d9c7f68..1c6ede5a2ad00 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/private_locations/delete_private_location.ts @@ -28,7 +28,6 @@ export const deletePrivateLocationRoute: SyntheticsRestApiRouteFactory { const { locationId } = request.params as { locationId: string }; diff --git a/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts b/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts index 4064a706c6a39..de9111ea00b19 100644 --- a/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts +++ b/x-pack/plugins/synthetics/server/routes/settings/sync_global_params.ts @@ -14,7 +14,6 @@ export const syncParamsSyntheticsParamsRoute: SyntheticsRestApiRouteFactory = () method: 'GET', path: SYNTHETICS_API_URLS.SYNC_GLOBAL_PARAMS, validate: {}, - writeAccess: true, handler: async ({ savedObjectsClient, syntheticsMonitorClient, diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts index 0aae10b340e8c..5124df7af6ce0 100644 --- a/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts +++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/enablement.ts @@ -16,6 +16,7 @@ import { export const getSyntheticsEnablementRoute: SyntheticsRestApiRouteFactory = () => ({ method: 'PUT', path: SYNTHETICS_API_URLS.SYNTHETICS_ENABLEMENT, + writeAccessOverride: true, validate: {}, handler: async ({ savedObjectsClient, request, server }): Promise => { try { diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts index edc9ccc3b71e6..e1ddceb4e5b7c 100644 --- a/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts @@ -22,7 +22,6 @@ export const runOnceSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () = monitorId: schema.string({ minLength: 1, maxLength: 1024 }), }), }, - writeAccess: true, handler: async ({ request, response, diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts index 8434d909f2c2f..08c4f8dbebb3c 100644 --- a/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/test_now_monitor.ts @@ -23,7 +23,6 @@ export const testNowMonitorRoute: SyntheticsRestApiRouteFactory monitorId: schema.string({ minLength: 1, maxLength: 1024 }), }), }, - writeAccess: true, handler: async (routeContext) => { const { monitorId } = routeContext.request.params; return triggerTestNow(monitorId, routeContext); diff --git a/x-pack/plugins/synthetics/server/routes/types.ts b/x-pack/plugins/synthetics/server/routes/types.ts index 7224a6a9e7f5a..4d27206a16f0e 100644 --- a/x-pack/plugins/synthetics/server/routes/types.ts +++ b/x-pack/plugins/synthetics/server/routes/types.ts @@ -32,6 +32,7 @@ export type SyntheticsRequest = KibanaRequest< export interface UMServerRoute { method: 'GET' | 'PUT' | 'POST' | 'DELETE'; writeAccess?: boolean; + writeAccessOverride?: boolean; handler: T; validation?: FullValidationConfig; streamHandler?: ( diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5eaceb182e5cd..0155d9d1de5f2 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -9066,8 +9066,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "Version du service", "xpack.apm.serviceLink.otherBucketName": "Services restants", "xpack.apm.serviceLink.tooltip": "Le nombre de services instrumentés a atteint la capacité actuelle du serveur APM", - "xpack.apm.serviceList.ui.limit.warning.calloutDescription": "Le nombre maximal de services pouvant être affichés dans Kibana a été atteint. Essayez d'affiner les résultats à l'aide de la barre de requête, ou envisagez d'utiliser les groupes de services.", - "xpack.apm.serviceList.ui.limit.warning.calloutTitle": "Le nombre de services dépasse le nombre maximal autorisé d'affichages (1 000)", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "Affichez les indicateurs d'intégrité du service en activant la détection des anomalies dans les paramètres APM.", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "Afficher les anomalies", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "Nous n'avons pas trouvé de score d'anomalie dans la plage temporelle sélectionnée. Consultez les détails dans l'explorateur d'anomalies.", @@ -9131,9 +9129,6 @@ "xpack.apm.serviceOverview.embeddedMap.sessionCountry.metric.label": "Sessions par pays", "xpack.apm.serviceOverview.embeddedMap.sessionRegion.metric.label": "Sessions par région", "xpack.apm.serviceOverview.embeddedMap.title": "Régions géographiques", - "xpack.apm.serviceOverview.errorsTable.errorMessage": "Impossible de récupérer", - "xpack.apm.serviceOverview.errorsTable.loading": "Chargement...", - "xpack.apm.serviceOverview.errorsTable.noResults": "Aucune erreur trouvée", "xpack.apm.serviceOverview.errorsTableLinkText": "Afficher les erreurs", "xpack.apm.serviceOverview.errorsTableTitle": "Erreurs", "xpack.apm.serviceOverview.instancesTable.actionMenus.container.subtitle": "Affichez les logs et les indicateurs de ce conteneur pour plus de détails.", @@ -9152,7 +9147,6 @@ "xpack.apm.serviceOverview.instancesTableColumnMemoryUsage": "Utilisation de la mémoire (moy.)", "xpack.apm.serviceOverview.instancesTableColumnNodeName": "Nom du nœud", "xpack.apm.serviceOverview.instancesTableColumnThroughput": "Rendement", - "xpack.apm.serviceOverview.instancesTableTitle": "Instances", "xpack.apm.serviceOverview.instanceTable.details.cloudTitle": "Cloud", "xpack.apm.serviceOverview.instanceTable.details.containerTitle": "Conteneur", "xpack.apm.serviceOverview.instanceTable.details.serviceTitle": "Service", @@ -9567,7 +9561,6 @@ "xpack.apm.transactions.sessionsChartTitle": "Sessions", "xpack.apm.transactionsCallout.cardinalityWarning.title": "Le nombre de groupes de transactions dépasse le nombre maximal (1 000) autorisé d'affichages.", "xpack.apm.transactionsCallout.transactionGroupLimit.exceeded": "Le nombre maximal de groupes de transactions affichés dans Kibana a été atteint. Essayez d'affiner les résultats à l'aide de la barre de requête.", - "xpack.apm.transactionsTable.errorMessage": "Impossible de récupérer", "xpack.apm.transactionsTable.linkText": "Afficher les transactions", "xpack.apm.transactionsTable.loading": "Chargement...", "xpack.apm.transactionsTable.noResults": "Aucune transaction trouvée", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c0d8dd949344c..6ec1330d0b14e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9080,8 +9080,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "サービスバージョン", "xpack.apm.serviceLink.otherBucketName": "残りのサービス", "xpack.apm.serviceLink.tooltip": "実行されたサービス数がAPMサーバーの現在の能力に達しました。", - "xpack.apm.serviceList.ui.limit.warning.calloutDescription": "Kibanaで表示できるサービスの最大数に達しました。クエリバーを使用して結果を絞り込むか、サービスグループの使用を検討してください。", - "xpack.apm.serviceList.ui.limit.warning.calloutTitle": "サービス数が表示可能な最大数(1,000)を超えました。", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "APM 設定で異常検知を有効にすると、サービス正常性インジケーターが表示されます。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "異常を表示", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "選択した時間範囲で、異常スコアを検出できませんでした。異常エクスプローラーで詳細を確認してください。", @@ -9145,9 +9143,6 @@ "xpack.apm.serviceOverview.embeddedMap.sessionCountry.metric.label": "国別セッション", "xpack.apm.serviceOverview.embeddedMap.sessionRegion.metric.label": "地域別セッション", "xpack.apm.serviceOverview.embeddedMap.title": "地域", - "xpack.apm.serviceOverview.errorsTable.errorMessage": "取得できませんでした", - "xpack.apm.serviceOverview.errorsTable.loading": "読み込み中...", - "xpack.apm.serviceOverview.errorsTable.noResults": "エラーが見つかりません", "xpack.apm.serviceOverview.errorsTableLinkText": "エラーを表示", "xpack.apm.serviceOverview.errorsTableTitle": "エラー", "xpack.apm.serviceOverview.instancesTable.actionMenus.container.subtitle": "このコンテナーのログとインデックスを表示し、さらに詳細を確認できます。", @@ -9166,7 +9161,6 @@ "xpack.apm.serviceOverview.instancesTableColumnMemoryUsage": "メモリー使用状況(平均)", "xpack.apm.serviceOverview.instancesTableColumnNodeName": "ノード名", "xpack.apm.serviceOverview.instancesTableColumnThroughput": "スループット", - "xpack.apm.serviceOverview.instancesTableTitle": "インスタンス", "xpack.apm.serviceOverview.instanceTable.details.cloudTitle": "クラウド", "xpack.apm.serviceOverview.instanceTable.details.containerTitle": "コンテナー", "xpack.apm.serviceOverview.instanceTable.details.serviceTitle": "サービス", @@ -9581,7 +9575,6 @@ "xpack.apm.transactions.sessionsChartTitle": "セッション", "xpack.apm.transactionsCallout.cardinalityWarning.title": "トランザクショングループ数が表示可能な最大数(1,000)を超えました。", "xpack.apm.transactionsCallout.transactionGroupLimit.exceeded": "Kibanaで表示されるトランザクショングループの最大数に達しました。クエリバーを使用して結果を絞り込んでください。", - "xpack.apm.transactionsTable.errorMessage": "取得できませんでした", "xpack.apm.transactionsTable.linkText": "トランザクションを表示", "xpack.apm.transactionsTable.loading": "読み込み中...", "xpack.apm.transactionsTable.noResults": "トランザクションが見つかりません", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a893ee0a19dab..ba48546d7999e 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9174,8 +9174,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "服务版本", "xpack.apm.serviceLink.otherBucketName": "剩余服务", "xpack.apm.serviceLink.tooltip": "检测的服务数已达到 APM 服务器的当前容量", - "xpack.apm.serviceList.ui.limit.warning.calloutDescription": "已达到可在 Kibana 中查看的最大服务数。尝试通过使用查询栏来缩小结果范围,或考虑使用服务组。", - "xpack.apm.serviceList.ui.limit.warning.calloutTitle": "服务数超出了显示的允许最大值 (1,000)", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "通过在 APM 设置中启用异常检测来显示服务运行状况指标。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "查看异常", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "在选定时间范围内找不到异常分数。请在 Anomaly Explorer 中查看详情。", @@ -9239,9 +9237,6 @@ "xpack.apm.serviceOverview.embeddedMap.sessionCountry.metric.label": "按国家/地区的会话", "xpack.apm.serviceOverview.embeddedMap.sessionRegion.metric.label": "按区域的会话", "xpack.apm.serviceOverview.embeddedMap.title": "地理区域", - "xpack.apm.serviceOverview.errorsTable.errorMessage": "无法提取", - "xpack.apm.serviceOverview.errorsTable.loading": "正在加载……", - "xpack.apm.serviceOverview.errorsTable.noResults": "未找到错误", "xpack.apm.serviceOverview.errorsTableLinkText": "查看错误", "xpack.apm.serviceOverview.errorsTableTitle": "错误", "xpack.apm.serviceOverview.instancesTable.actionMenus.container.subtitle": "查看此容器的日志和指标以获取进一步详情。", @@ -9260,7 +9255,6 @@ "xpack.apm.serviceOverview.instancesTableColumnMemoryUsage": "内存使用率(平均值)", "xpack.apm.serviceOverview.instancesTableColumnNodeName": "节点名称", "xpack.apm.serviceOverview.instancesTableColumnThroughput": "吞吐量", - "xpack.apm.serviceOverview.instancesTableTitle": "实例", "xpack.apm.serviceOverview.instanceTable.details.cloudTitle": "云", "xpack.apm.serviceOverview.instanceTable.details.containerTitle": "容器", "xpack.apm.serviceOverview.instanceTable.details.serviceTitle": "服务", @@ -9675,7 +9669,6 @@ "xpack.apm.transactions.sessionsChartTitle": "会话", "xpack.apm.transactionsCallout.cardinalityWarning.title": "事务组数目超出了显示的允许最大值 (1,000)。", "xpack.apm.transactionsCallout.transactionGroupLimit.exceeded": "已达到在 Kibana 中显示的最大事务组数目。尝试通过使用查询栏来缩小结果范围。", - "xpack.apm.transactionsTable.errorMessage": "无法提取", "xpack.apm.transactionsTable.linkText": "查看事务", "xpack.apm.transactionsTable.loading": "正在加载……", "xpack.apm.transactionsTable.noResults": "找不到任何事务", diff --git a/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts b/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts index bdcd2f30c1f84..09ad6c631cbfa 100644 --- a/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts +++ b/x-pack/test/apm_api_integration/tests/error_rate/service_apis.spec.ts @@ -113,6 +113,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { kuery: `processor.event : "${processorEvent}"`, transactionType: 'request', latencyAggregationType: 'avg' as LatencyAggregationType, + sortField: 'throughput', + sortDirection: 'desc', }, }, }), diff --git a/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts b/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts index d174bcdf03411..a3904e77e26ec 100644 --- a/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts +++ b/x-pack/test/apm_api_integration/tests/latency/service_apis.spec.ts @@ -118,6 +118,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { kuery: `processor.event : "${processorEvent}"`, transactionType: 'request', latencyAggregationType: 'avg' as LatencyAggregationType, + sortField: 'throughput', + sortDirection: 'desc', }, }, }), diff --git a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap b/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap index 022048cdbd5ed..f3fb16ec38b15 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap +++ b/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instance_details.spec.snap @@ -9,7 +9,7 @@ Object { "id": "123", }, "host": Object { - "name": "metric-only-production", + "name": "multiple-env-service-production", }, "kubernetes": Object { "container": Object {}, @@ -23,7 +23,7 @@ Object { "environment": "production", "name": "service1", "node": Object { - "name": "metric-only-production", + "name": "multiple-env-service-production", }, }, } diff --git a/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts b/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts index 8736b46f73459..ad3e872bcc879 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/get_service_node_ids.ts @@ -32,6 +32,8 @@ export async function getServiceNodeIds({ transactionType: 'request', environment: 'ENVIRONMENT_ALL', kuery: '', + sortField: 'throughput', + sortDirection: 'desc', }, }, }); diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts index f8895b73ab0db..4ff96129dfcf9 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instance_details.spec.ts @@ -56,7 +56,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const metricOnlyInstance = apm .service({ name: 'service1', environment: 'production', agentName: 'java' }) - .instance('metric-only-production'); + .instance('multiple-env-service-production'); before(async () => { return synthtrace.index([ diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts index f215882c09bd2..4e92e657de49f 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.spec.ts @@ -4,436 +4,684 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ import expect from '@kbn/expect'; -import { pick, sortBy } from 'lodash'; -import moment from 'moment'; -import { apm, timerange } from '@kbn/apm-synthtrace-client'; import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { isFiniteNumber } from '@kbn/apm-plugin/common/utils/is_finite_number'; - +import { apm, Instance, timerange } from '@kbn/apm-synthtrace-client'; import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; -import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { SERVICE_NODE_NAME_MISSING } from '@kbn/apm-plugin/common/service_nodes'; -import archives from '../../common/fixtures/es_archiver/archives_metadata'; +import { InstancesSortField } from '@kbn/apm-plugin/common/instances'; +import { sum } from 'lodash'; import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { roundNumber } from '../../utils'; + +type ServiceOverviewInstancesMainStatistics = + APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; export default function ApiTest({ getService }: FtrProviderContext) { const registry = getService('registry'); const apmApiClient = getService('apmApiClient'); - const synthtraceEsClient = getService('synthtraceEsClient'); - - const archiveName = 'apm_8.0.0'; - const { start, end } = archives[archiveName]; + const synthtrace = getService('synthtraceEsClient'); + + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:10:00.000Z').getTime(); + + async function getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField = 'throughput', + sortDirection = 'desc', + }: { + serviceName: string; + sortField?: InstancesSortField; + sortDirection?: 'asc' | 'desc'; + }) { + const { body } = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, + params: { + path: { serviceName }, + query: { + latencyAggregationType: LatencyAggregationType.avg, + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + transactionType: 'request', + environment: 'production', + kuery: '', + sortField, + sortDirection, + }, + }, + }); + + return body.currentPeriod; + } registry.when( - 'Service overview instances main statistics when data is not loaded', + 'Instances main statistics when data is not loaded', { config: 'basic', archives: [] }, () => { describe('when data is not loaded', () => { - it('handles the empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - transactionType: 'request', - start: moment(end).subtract(15, 'minutes').toISOString(), - end, - offset: '15m', - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, - }); - expect(response.status).to.be(200); - expect(response.body.currentPeriod).to.eql([]); - expect(response.body.previousPeriod).to.eql([]); + it('handles empty state', async () => { + const response = await getServiceOverviewInstancesMainStatistics({ serviceName: 'foo' }); + expect(response).to.eql({}); }); }); } ); registry.when( - 'Service overview instances main statistics when data is loaded without comparison', - { config: 'basic', archives: [archiveName] }, + 'Instances main statistics when data is loaded', + { config: 'basic', archives: [] }, () => { - describe('fetching java data', () => { - let response: { - body: APIReturnType<`GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`>; - }; - - beforeEach(async () => { - response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - start, - end, - transactionType: 'request', - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, - }); - }); - - it('returns a service node item', () => { - expect(response.body.currentPeriod.length).to.be.greaterThan(0); - }); + describe('Return Top 100 instances', () => { + const serviceName = 'synth-node-1'; + before(() => { + const range = timerange(start, end); + const transactionName = 'foo'; + + const successfulTimestamps = range.interval('1m').rate(1); + const failedTimestamps = range.interval('1m').rate(1); + + const instances = [...Array(200).keys()].map((index) => + apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`) + ); + + const instanceSpans = (instance: Instance) => { + const successfulTraceEvents = successfulTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .duration(1000) + .success() + .destination('elasticsearch') + .timestamp(timestamp), + instance + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .duration(100) + .success() + .timestamp(timestamp) + ) + ); - it('returns statistics for each service node', () => { - const item = response.body.currentPeriod[0]; + const failedTraceEvents = failedTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); - expect(isFiniteNumber(item.cpuUsage)).to.be(true); - expect(isFiniteNumber(item.memoryUsage)).to.be(true); - expect(isFiniteNumber(item.errorRate)).to.be(true); - expect(isFiniteNumber(item.throughput)).to.be(true); - expect(isFiniteNumber(item.latency)).to.be(true); + const metricsets = range + .interval('30s') + .rate(1) + .generator((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) + ); + + return [successfulTraceEvents, failedTraceEvents, metricsets]; + }; + + return synthtrace.index(instances.flatMap((instance) => instanceSpans(instance))); }); - it('returns the right data', () => { - const items = sortBy(response.body.currentPeriod, 'serviceNodeName'); - - const serviceNodeNames = items.map((item) => item.serviceNodeName); - - expectSnapshot(items.length).toMatchInline(`1`); - - expectSnapshot(serviceNodeNames).toMatchInline(` - Array [ - "31651f3c624b81c55dd4633df0b5b9f9ab06b151121b0404ae796632cd1f87ad", - ] - `); - - const item = items[0]; + after(() => { + return synthtrace.clean(); + }); + describe('fetch instances', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); + }); + it('returns top 100 instances', () => { + expect(instancesMainStats.length).to.be(100); + }); + }); + }); - const values = pick(item, [ - 'cpuUsage', - 'memoryUsage', - 'errorRate', - 'throughput', - 'latency', + describe('Order by error rate', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + /** + * Instance A + * 90 transactions = Success + * 10 transactions = Failure + * Error rate: 10% + */ + const instanceA = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-A'); + const instanceASuccessfulTraceEvents = range + .interval('1m') + .rate(10) + .generator((timestamp, index) => + index < 10 + ? instanceA + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceA + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + : instanceA + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + ); + /** + * Instance B + * 1 transactions = Success + * 9 transactions = Failure + * Error rate: 90% + */ + const instanceB = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-B'); + const instanceBSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp, index) => + index === 0 + ? instanceB + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + : instanceB + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceB + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance C + * 2 transactions = Success + * 8 transactions = Failure + * Error rate: 80% + */ + const instanceC = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-C'); + const instanceCSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp, index) => + index < 2 + ? instanceC + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + : instanceC + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceC + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance D + * 0 transactions = Success + * 10 transactions = Failure + * Error rate: 100% + */ + const instanceD = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-D'); + const instanceDSuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp) => + instanceD + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceD + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + /** + * Instance E + * 10 transactions = Success + * 0 transactions = Failure + * Error rate: 0% + */ + const instanceE = apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance('instance-E'); + const instanceESuccessfulTraceEvents = range + .interval('1m') + .rate(1) + .generator((timestamp) => + instanceE + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + ); + return synthtrace.index([ + instanceASuccessfulTraceEvents, + instanceBSuccessfulTraceEvents, + instanceCSuccessfulTraceEvents, + instanceDSuccessfulTraceEvents, + instanceESuccessfulTraceEvents, ]); - - expectSnapshot(values).toMatchInline(` - Object { - "cpuUsage": 0.002, - "errorRate": 0.0848214285714286, - "latency": 411589.785714286, - "memoryUsage": 0.786029688517253, - "throughput": 7.46666666666667, - } - `); }); - }); - describe('fetching non-java data', () => { - let response: { - body: APIReturnType<`GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`>; - }; - - beforeEach(async () => { - response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-ruby' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - start, - end, - transactionType: 'request', - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }, + after(() => { + return synthtrace.clean(); + }); + describe('sort by error rate asc', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: 'errorRate', + sortDirection: 'asc', + }); + }); + it('returns instances sorted asc', () => { + expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ + 0, 0.1, 0.8, 0.9, 1, + ]); }); }); - - it('returns statistics for each service node', () => { - const item = response.body.currentPeriod[0]; - - expect(isFiniteNumber(item.cpuUsage)).to.be(true); - expect(isFiniteNumber(item.memoryUsage)).to.be(true); - expect(isFiniteNumber(item.errorRate)).to.be(true); - expect(isFiniteNumber(item.throughput)).to.be(true); - expect(isFiniteNumber(item.latency)).to.be(true); + describe('sort by error rate desc', () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: 'errorRate', + sortDirection: 'desc', + }); + }); + it('returns instances sorted desc', () => { + expect(instancesMainStats.map((item) => roundNumber(item.errorRate))).to.eql([ + 1, 0.9, 0.8, 0.1, 0, + ]); + }); }); + }); - it('returns the right data', () => { - const items = sortBy(response.body.currentPeriod, 'serviceNodeName'); - - const serviceNodeNames = items.map((item) => item.serviceNodeName); - - expectSnapshot(items.length).toMatchInline(`1`); - - expectSnapshot(serviceNodeNames).toMatchInline(` - Array [ - "b4c600993a0b233120cd333b8c4a7e35e73ee8f18f95b5854b8d7f6442531466", - ] - `); - - const item = items[0]; - - const values = pick(item, 'cpuUsage', 'errorRate', 'throughput', 'latency'); - - expectSnapshot(values).toMatchInline(` - Object { - "cpuUsage": 0.001, - "errorRate": 0.00341296928327645, - "latency": 40989.5802047782, - "throughput": 9.76666666666667, - } - `); + describe('with transactions and system metrics', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + const instances = Array(3) + .fill(0) + .map((_, idx) => { + const index = idx + 1; + return { + instance: apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`), + duration: index * 1000, + rate: index * 10, + errorRate: 5, + }; + }); + + return synthtrace.index( + instances.flatMap(({ instance, duration, rate, errorRate }) => { + const successfulTraceEvents = range + .interval('1m') + .rate(rate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .success() + ); + const failedTraceEvents = range + .interval('1m') + .rate(errorRate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + const metricsets = range + .interval('30s') + .rate(1) + .generator((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) + ); + return [successfulTraceEvents, failedTraceEvents, metricsets]; + }) + ); + }); - expectSnapshot(values); + after(() => { + return synthtrace.clean(); }); - }); - } - ); - registry.when( - 'Service overview instances main statistics when data is loaded with comparison', - { config: 'basic', archives: [archiveName] }, - () => { - describe('fetching java data', () => { - let response: { - body: APIReturnType<`GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`>; - }; - - beforeEach(async () => { - response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics`, - params: { - path: { serviceName: 'opbeans-java' }, - query: { - latencyAggregationType: LatencyAggregationType.avg, - transactionType: 'request', - start: moment(end).subtract(15, 'minutes').toISOString(), - end, - offset: '15m', - environment: 'ENVIRONMENT_ALL', - kuery: '', + describe('test order of items', () => { + ( + [ + { + field: 'throughput', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + expectedValues: [15, 25, 35], }, - }, - }); + { + field: 'throughput', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + expectedValues: [35, 25, 15], + }, + { + field: 'latency', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + expectedValues: [1000000, 2000000, 3000000], + }, + { + field: 'latency', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + expectedValues: [3000000, 2000000, 1000000], + }, + { + field: 'serviceNodeName', + direction: 'asc', + expectedServiceNodeNames: ['instance-1', 'instance-2', 'instance-3'], + }, + { + field: 'serviceNodeName', + direction: 'desc', + expectedServiceNodeNames: ['instance-3', 'instance-2', 'instance-1'], + }, + ] as Array<{ + field: InstancesSortField; + direction: 'asc' | 'desc'; + expectedServiceNodeNames: string[]; + expectedValues?: number[]; + }> + ).map(({ field, direction, expectedServiceNodeNames, expectedValues }) => + describe(`fetch instances main statistics ordered by ${field} ${direction}`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; + + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + sortField: field, + sortDirection: direction, + }); + }); + + it('returns ordered instance main stats', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql( + expectedServiceNodeNames + ); + if (expectedValues) { + expect( + instancesMainStats.map((item) => { + const value = item[field]; + if (typeof value === 'number') { + return roundNumber(value); + } + return value; + }) + ).to.eql(expectedValues); + } + }); + + it('returns system metrics', () => { + expect(instancesMainStats.map((item) => roundNumber(item.cpuUsage))).to.eql([ + 0.7, 0.7, 0.7, + ]); + expect(instancesMainStats.map((item) => roundNumber(item.memoryUsage))).to.eql([ + 0.2, 0.2, 0.2, + ]); + }); + }) + ); }); + }); - it('returns a service node item', () => { - expect(response.body.currentPeriod.length).to.be.greaterThan(0); - expect(response.body.previousPeriod.length).to.be.greaterThan(0); + describe('with transactions only', () => { + const serviceName = 'synth-node-1'; + before(async () => { + const range = timerange(start, end); + const transactionName = 'foo'; + const instances = Array(3) + .fill(0) + .map((_, idx) => { + const index = idx + 1; + return { + instance: apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${index}`), + duration: index * 1000, + rate: index * 10, + errorRate: 5, + }; + }); + + return synthtrace.index( + instances.flatMap(({ instance, duration, rate, errorRate }) => { + const successfulTraceEvents = range + .interval('1m') + .rate(rate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .success() + ); + const failedTraceEvents = range + .interval('1m') + .rate(errorRate) + .generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .failure() + .errors( + instance + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + ); + return [successfulTraceEvents, failedTraceEvents]; + }) + ); }); - it('returns statistics for each service node', () => { - const currentItem = response.body.currentPeriod[0]; - - expect(isFiniteNumber(currentItem.cpuUsage)).to.be(true); - expect(isFiniteNumber(currentItem.memoryUsage)).to.be(true); - expect(isFiniteNumber(currentItem.errorRate)).to.be(true); - expect(isFiniteNumber(currentItem.throughput)).to.be(true); - expect(isFiniteNumber(currentItem.latency)).to.be(true); - - const previousItem = response.body.previousPeriod[0]; - - expect(isFiniteNumber(previousItem.cpuUsage)).to.be(true); - expect(isFiniteNumber(previousItem.memoryUsage)).to.be(true); - expect(isFiniteNumber(previousItem.errorRate)).to.be(true); - expect(isFiniteNumber(previousItem.throughput)).to.be(true); - expect(isFiniteNumber(previousItem.latency)).to.be(true); + after(() => { + return synthtrace.clean(); }); - it('returns the right data', () => { - const items = sortBy(response.body.previousPeriod, 'serviceNodeName'); + describe(`Fetch main statistics`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; - const serviceNodeNames = items.map((item) => item.serviceNodeName); + before(async () => { + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); + }); - expectSnapshot(items.length).toMatchInline(`1`); + it('returns instances name', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ + 'instance-3', + 'instance-2', + 'instance-1', + ]); + }); - expectSnapshot(serviceNodeNames).toMatchInline(` - Array [ - "31651f3c624b81c55dd4633df0b5b9f9ab06b151121b0404ae796632cd1f87ad", - ] - `); + it('returns throughput', () => { + expect(sum(instancesMainStats.map((item) => item.throughput))).to.greaterThan(0); + }); - const item = items[0]; + it('returns latency', () => { + expect(sum(instancesMainStats.map((item) => item.latency))).to.greaterThan(0); + }); - const values = pick(item, [ - 'cpuUsage', - 'memoryUsage', - 'errorRate', - 'throughput', - 'latency', - ]); + it('returns errorRate', () => { + expect(sum(instancesMainStats.map((item) => item.errorRate))).to.greaterThan(0); + }); + + it('does not return cpu usage', () => { + expect( + instancesMainStats.map((item) => item.cpuUsage).filter((value) => value !== undefined) + ).to.eql([]); + }); - expectSnapshot(values).toMatchInline(` - Object { - "cpuUsage": 0.00223333333333333, - "errorRate": 0.0894308943089431, - "latency": 739013.634146341, - "memoryUsage": 0.783296203613281, - "throughput": 8.2, - } - `); + it('does not return memory usage', () => { + expect( + instancesMainStats + .map((item) => item.memoryUsage) + .filter((value) => value !== undefined) + ).to.eql([]); + }); }); }); - } - ); - - registry.when( - 'Service overview instances main statistics when data is generated', - { config: 'basic', archives: [] }, - () => { - describe('for two go instances and one java instance', () => { - const GO_A_INSTANCE_RATE_SUCCESS = 10; - const GO_A_INSTANCE_RATE_FAILURE = 5; - const GO_B_INSTANCE_RATE_SUCCESS = 15; - - const JAVA_INSTANCE_RATE = 20; - - const rangeStart = new Date('2021-01-01T12:00:00.000Z').getTime(); - const rangeEnd = new Date('2021-01-01T12:15:00.000Z').getTime() - 1; + describe('with system metrics only', () => { + const serviceName = 'synth-node-1'; before(async () => { - const goService = apm.service({ - name: 'opbeans-go', - environment: 'production', - agentName: 'go', - }); - const javaService = apm.service({ - name: 'opbeans-java', - environment: 'production', - agentName: 'java', - }); - - const goInstanceA = goService.instance('go-instance-a'); - const goInstanceB = goService.instance('go-instance-b'); - const javaInstance = javaService.instance('java-instance'); - - const interval = timerange(rangeStart, rangeEnd).interval('1m'); - - // include exit spans to generate span_destination metrics - // that should not be included - function withSpans(timestamp: number) { - return new Array(3).fill(undefined).map(() => - goInstanceA - .span({ - spanName: 'GET apm-*/_search', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .timestamp(timestamp + 100) - .duration(300) - .destination('elasticsearch') - .success() + const range = timerange(start, end); + const instances = Array(3) + .fill(0) + .map((_, idx) => + apm + .service({ name: serviceName, environment: 'production', agentName: 'nodejs' }) + .instance(`instance-${idx + 1}`) ); - } - return synthtraceEsClient.index([ - interval.rate(GO_A_INSTANCE_RATE_SUCCESS).generator((timestamp) => - goInstanceA - .transaction({ transactionName: 'GET /api/product/list' }) - .success() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - interval.rate(GO_A_INSTANCE_RATE_FAILURE).generator((timestamp) => - goInstanceA - .transaction({ transactionName: 'GET /api/product/list' }) - .failure() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - interval.rate(GO_B_INSTANCE_RATE_SUCCESS).generator((timestamp) => - goInstanceB - .transaction({ transactionName: 'GET /api/product/list' }) - .success() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - interval.rate(JAVA_INSTANCE_RATE).generator((timestamp) => - javaInstance - .transaction({ transactionName: 'GET /api/product/list' }) - .success() - .duration(500) - .timestamp(timestamp) - .children(...withSpans(timestamp)) - ), - ]); + return synthtrace.index( + instances.map((instance) => { + const metricsets = range + .interval('30s') + .rate(1) + .generator((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) + ); + return metricsets; + }) + ); }); - after(async () => { - return synthtraceEsClient.clean(); + after(() => { + return synthtrace.clean(); }); - describe('for the go service', () => { - let body: APIReturnType<'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics'>; + describe(`Fetch main statistics`, () => { + let instancesMainStats: ServiceOverviewInstancesMainStatistics['currentPeriod']; before(async () => { - body = ( - await apmApiClient.readUser({ - endpoint: - 'GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics', - params: { - path: { - serviceName: 'opbeans-go', - }, - query: { - start: new Date(rangeStart).toISOString(), - end: new Date(rangeEnd + 1).toISOString(), - environment: ENVIRONMENT_ALL.value, - kuery: '', - latencyAggregationType: LatencyAggregationType.avg, - transactionType: 'request', - }, - }, - }) - ).body; + instancesMainStats = await getServiceOverviewInstancesMainStatistics({ + serviceName, + }); }); - it('returns statistics for the go instances', () => { - const goAStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'go-instance-a' - ); - const goBStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'go-instance-b' - ); - - expect(goAStats?.throughput).to.eql( - GO_A_INSTANCE_RATE_SUCCESS + GO_A_INSTANCE_RATE_FAILURE - ); - - expect(goBStats?.throughput).to.eql(GO_B_INSTANCE_RATE_SUCCESS); + it('returns instances name', () => { + expect(instancesMainStats.map((item) => item.serviceNodeName)).to.eql([ + 'instance-1', + 'instance-2', + 'instance-3', + ]); }); - it('does not return data for the java service', () => { - const javaStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'java-instance' - ); - - expect(javaStats).to.be(undefined); + it('does not return throughput', () => { + expect( + instancesMainStats + .map((item) => item.throughput) + .filter((value) => value !== undefined) + ).to.eql([]); }); - it('does not return metrics', () => { - const goAStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === 'go-instance-a' - ); + it('does not return latency', () => { + expect( + instancesMainStats.map((item) => item.latency).filter((value) => value !== undefined) + ).to.eql([]); + }); - expect(goAStats).to.not.be(undefined); - expect(goAStats?.memoryUsage).to.be(undefined); - expect(goAStats?.cpuUsage).to.be(undefined); + it('does not return errorRate', () => { + expect( + instancesMainStats + .map((item) => item.errorRate) + .filter((value) => value !== undefined) + ).to.eql([]); }); - it('does not return data for missing service node name', () => { - const missingNameStats = body.currentPeriod.find( - (stat) => stat.serviceNodeName === SERVICE_NODE_NAME_MISSING - ); + it('returns cpu usage', () => { + expect(sum(instancesMainStats.map((item) => item.cpuUsage))).to.greaterThan(0); + }); - expect(missingNameStats).to.be(undefined); + it('returns memory usage', () => { + expect(sum(instancesMainStats.map((item) => item.memoryUsage))).to.greaterThan(0); }); }); }); diff --git a/x-pack/test/apm_api_integration/tests/services/agent.spec.ts b/x-pack/test/apm_api_integration/tests/services/agent.spec.ts index 69f1938192b9e..2dc676ffe5a34 100644 --- a/x-pack/test/apm_api_integration/tests/services/agent.spec.ts +++ b/x-pack/test/apm_api_integration/tests/services/agent.spec.ts @@ -34,7 +34,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - registry.when( + // FLAKY: https://github.com/elastic/kibana/issues/175756 + registry.when.skip( 'Agent name when data is loaded', { config: 'basic', archives: [archiveName] }, () => { diff --git a/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts b/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts index b519a28de70e8..b6dc025ecef10 100644 --- a/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts +++ b/x-pack/test/apm_api_integration/tests/services/top_services.spec.ts @@ -56,7 +56,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.status).to.be(200); expect(response.body.items.length).to.be(0); - expect(response.body.maxServiceCountExceeded).to.be(false); + expect(response.body.maxCountExceeded).to.be(false); expect(response.body.serviceOverflowCount).to.be(0); }); } diff --git a/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts b/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts index 8294797a08949..8dcb782c78a03 100644 --- a/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts +++ b/x-pack/test/apm_api_integration/tests/throughput/service_apis.spec.ts @@ -109,6 +109,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { kuery: `processor.event : "${processorEvent}"`, transactionType: 'request', latencyAggregationType: 'avg' as LatencyAggregationType, + sortField: 'throughput', + sortDirection: 'desc', }, }, }), diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts index 3a7fedc76ef3e..91682c0edf796 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.spec.ts @@ -68,7 +68,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const transactionsGroupsPrimaryStatistics = await callApi(); expect(transactionsGroupsPrimaryStatistics.transactionGroups).to.empty(); - expect(transactionsGroupsPrimaryStatistics.maxTransactionGroupsExceeded).to.be(false); + expect(transactionsGroupsPrimaryStatistics.maxCountExceeded).to.be(false); }); } ); @@ -138,7 +138,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { transactionsGroupsPrimaryStatisticsWithDurationSummaryTrue, ].forEach((statistics) => { expect(statistics.transactionGroups.length).to.be(3); - expect(statistics.maxTransactionGroupsExceeded).to.be(false); + expect(statistics.maxCountExceeded).to.be(false); expect(statistics.transactionGroups.map(({ name }) => name)).to.eql( transactions.map(({ name }) => name) ); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts index e49c48fbf2347..c1edd4280be85 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/user_actions_get_users.ts @@ -43,6 +43,10 @@ export default ({ getService }: FtrProviderContext): void => { const es = getService('es'); const kibanaServer = getService('kibanaServer'); + // Use simple image data URL to match server side validation of image type + const IMAGE_URL_TEST = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAIBJREFUeF7t14ERACAMAjG6/9A6yMcROEuOe9tb+J0A/AAnoAPCHTglSAEKUIACFAgngEEMYhCDGAwjYAxhEIMYxCAGMRhOAIMYxCAGMRhGwBrEIAYxiEEMYjCcAAYxiEEMYjCMgDWIQQxiEIMYxGA4AQxiEIMYxGAYAWsQg3UGPw2Yf8EFsz4JAAAAAElFTkSuQmCC'; + describe('user_actions_get_users', () => { afterEach(async () => { await deleteAllCaseItems(es); @@ -160,7 +164,7 @@ export default ({ getService }: FtrProviderContext): void => { req: { initials: 'ES', color: '#6092C0', - imageUrl: 'my-image', + imageUrl: IMAGE_URL_TEST, }, headers: superUserHeaders, }); diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts index 7547bf67be8ab..0f8891dcb3b94 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/rule_page.ts @@ -23,6 +23,8 @@ export const RULES_ENABLED_FILTER = 'rules-enabled-filter'; export const CIS_SECTION_FILTER = 'options-filter-popover-button-cis-section-multi-select-filter'; export const RULE_NUMBER_FILTER = 'options-filter-popover-button-rule-number-multi-select-filter'; export const RULE_NUMBER_FILTER_SEARCH_FIELD = 'rule-number-search-input'; +export const RULES_FLYOUT_SWITCH_BUTTON = 'rule-flyout-switch-button'; +export const TAKE_ACTION_BUTTON = 'csp:take_action'; export function RulePagePageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); @@ -110,6 +112,33 @@ export function RulePagePageProvider({ getService, getPageObjects }: FtrProvider await textField.type(value); await PageObjects.header.waitUntilLoadingHasFinished(); }, + + clickRulesNames: async (index: number) => { + const rulesNames = await testSubjects.findAll('csp_rules_table_row_item_name'); + await rulesNames[index].click(); + }, + + clickFlyoutEnableSwitchButton: async () => { + const rulesFlyoutEnableSwitchButton = await testSubjects.find(RULES_FLYOUT_SWITCH_BUTTON); + await rulesFlyoutEnableSwitchButton.click(); + }, + + getEnableSwitchButtonState: async () => { + const rulesFlyoutEnableSwitchButton = await testSubjects.find(RULES_FLYOUT_SWITCH_BUTTON); + return await rulesFlyoutEnableSwitchButton.getAttribute('aria-checked'); + }, + + clickTakeActionButton: async () => { + const takeActionButton = await testSubjects.find(TAKE_ACTION_BUTTON); + await takeActionButton.click(); + }, + + clickTakeActionButtonOption: async (action: 'enable' | 'disable') => { + const takeActionOption = await testSubjects.find( + action + '-benchmark-rule-take-action-button' + ); + await takeActionOption.click(); + }, }; const navigateToRulePage = async (benchmarkCisId: string, benchmarkCisVersion: string) => { diff --git a/x-pack/test/cloud_security_posture_functional/pages/rules.ts b/x-pack/test/cloud_security_posture_functional/pages/rules.ts index 4841c9ad6b8b3..eae39c5ce9955 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/rules.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/rules.ts @@ -66,7 +66,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); }); - describe('Rules Page - Bulk Action buttons', () => { + // FLAKY: https://github.com/elastic/kibana/issues/175614 + describe.skip('Rules Page - Bulk Action buttons', () => { it('It should disable both Enable and Disable options when there are no rules selected', async () => { await rule.rulePage.toggleBulkActionButton(); expect( @@ -163,5 +164,21 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect((await rule.rulePage.getEnableRulesRowSwitchButton()) === 1).to.be(true); }); }); + + describe('Rules Page - Flyout', () => { + it('Users are able to Enable/Disable Rule from Switch on Rule Flyout', async () => { + await rule.rulePage.clickRulesNames(0); + await rule.rulePage.clickFlyoutEnableSwitchButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); + expect((await rule.rulePage.getEnableSwitchButtonState()) === 'false').to.be(true); + }); + it('Users are able to Enable/Disable Rule from Take Action on Rule Flyout', async () => { + await rule.rulePage.clickRulesNames(0); + await rule.rulePage.clickTakeActionButton(); + await rule.rulePage.clickTakeActionButtonOption('enable'); + await pageObjects.header.waitUntilLoadingHasFinished(); + expect((await rule.rulePage.getEnableSwitchButtonState()) === 'true').to.be(true); + }); + }); }); } diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts index dac2d1ae1fa36..17f07c0d26297 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/custom_urls.ts @@ -38,7 +38,8 @@ export default function ({ getService }: FtrProviderContext) { const ml = getService('ml'); const browser = getService('browser'); - describe('custom urls', function () { + // FLAKY: https://github.com/elastic/kibana/issues/164224 + describe.skip('custom urls', function () { const dfaJobId = `fq_regression_${Date.now()}`; const generateDestinationIndex = (analyticsId: string) => `user-${analyticsId}`; let testDashboardId: string | null = null; diff --git a/x-pack/test/functional/apps/observability_log_explorer/app.ts b/x-pack/test/functional/apps/observability_logs_explorer/app.ts similarity index 87% rename from x-pack/test/functional/apps/observability_log_explorer/app.ts rename to x-pack/test/functional/apps/observability_logs_explorer/app.ts index 5d6c85e3c7518..87da77752e58d 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/app.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/app.ts @@ -9,7 +9,7 @@ import { log, timerange } from '@kbn/apm-synthtrace-client'; import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects(['common', 'navigationalSearch', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['common', 'navigationalSearch', 'observabilityLogsExplorer']); const testSubjects = getService('testSubjects'); const synthtrace = getService('logSynthtraceEsClient'); const dataGrid = getService('dataGrid'); @@ -17,15 +17,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Application', () => { it('is shown in the global search', async () => { await PageObjects.common.navigateToApp('home'); - await PageObjects.navigationalSearch.searchFor('log explorer'); + await PageObjects.navigationalSearch.searchFor('logs explorer'); const results = await PageObjects.navigationalSearch.getDisplayedResults(); expect(results[0].label).to.eql('Logs Explorer'); }); it('is shown in the observability side navigation', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); - await testSubjects.existOrFail('observability-nav-observability-log-explorer-explorer'); + await PageObjects.observabilityLogsExplorer.navigateTo(); + await testSubjects.existOrFail('observability-nav-observability-logs-explorer-explorer'); }); it('should load logs', async () => { @@ -33,7 +33,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const to = '2023-08-03T10:24:14.091Z'; const COUNT = 5; await synthtrace.index(generateLogsData({ from, to, count: COUNT })); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const docCount = await dataGrid.getDocCount(); expect(docCount).to.be(COUNT); diff --git a/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts b/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts similarity index 96% rename from x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts rename to x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts index 0433b3a9762ce..e6291e4d8fc01 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/columns_selection.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts @@ -13,7 +13,7 @@ const defaultLogColumns = ['@timestamp', 'resource', 'content']; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); - const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer']); const synthtrace = getService('logSynthtraceEsClient'); const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); @@ -21,8 +21,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const to = '2023-12-27T10:25:14.091Z'; const TEST_TIMEOUT = 10 * 1000; // 10 secs - const navigateToLogExplorer = () => - PageObjects.observabilityLogExplorer.navigateTo({ + const navigateToLogsExplorer = () => + PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -32,10 +32,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }, }); - describe('When the log explorer loads', () => { + describe('When the logs explorer loads', () => { before(async () => { await synthtrace.index(generateLogsData({ to })); - await navigateToLogExplorer(); + await navigateToLogsExplorer(); }); after(async () => { @@ -50,7 +50,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the table columns from the URL state if exists', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -123,7 +123,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(cellValue.includes('event.original')).to.be(false); const cellAttribute = await cellElement.findByTestSubject( - 'logExplorerCellDescriptionList' + 'logsExplorerCellDescriptionList' ); expect(cellAttribute).not.to.be.empty(); }); @@ -137,7 +137,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('on cell expansion with message field should open regular popover', async () => { - await navigateToLogExplorer(); + await navigateToLogsExplorer(); await retry.tryForTime(TEST_TIMEOUT, async () => { await dataGrid.clickCellExpandButton(3, 4); await testSubjects.existOrFail('euiDataGridExpansionPopover'); @@ -158,7 +158,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('virtual column cell actions', async () => { beforeEach(async () => { - await navigateToLogExplorer(); + await navigateToLogsExplorer(); }); it('should render a popover with cell actions when a chip on content column is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { diff --git a/x-pack/test/functional/apps/observability_log_explorer/config.ts b/x-pack/test/functional/apps/observability_logs_explorer/config.ts similarity index 100% rename from x-pack/test/functional/apps/observability_log_explorer/config.ts rename to x-pack/test/functional/apps/observability_logs_explorer/config.ts diff --git a/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selection_state.ts similarity index 75% rename from x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts rename to x-pack/test/functional/apps/observability_logs_explorer/dataset_selection_state.ts index d8083c4e1e2e1..8cf11615152e1 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/dataset_selection_state.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selection_state.ts @@ -25,14 +25,14 @@ const azureActivityDatasetSelection: DatasetSelectionPlain = { export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const retry = getService('retry'); - const PageObjects = getPageObjects(['common', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['common', 'observabilityLogsExplorer']); describe('DatasetSelection initialization and update', () => { describe('when no dataset selection is given', () => { it('should initialize the "All logs" selection', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('All logs'); }); @@ -40,20 +40,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when a dataset selection is given', () => { it('should restore the selection from a valid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, }); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); it('should fallback to the "All logs" selection and notify the user of an invalid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateToWithUncheckedState({ + await PageObjects.observabilityLogsExplorer.navigateToWithUncheckedState({ pageState: { v: 1, datasetSelection: { @@ -63,41 +63,41 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); - await PageObjects.observabilityLogExplorer.assertRestoreFailureToastExist(); + await PageObjects.observabilityLogsExplorer.assertRestoreFailureToastExist(); expect(datasetSelectionTitle).to.be('All logs'); }); }); describe('when navigating back and forth on the page history', () => { it('should decode and restore the selection for the current index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const allDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(allDatasetSelectionTitle).to.be('All logs'); - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, }); const azureDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(azureDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); // Go back to previous page selection await retry.tryForTime(30 * 1000, async () => { await browser.goBack(); const backNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(backNavigationDatasetSelectionTitle).to.be('All logs'); }); // Go forward to previous page selection await retry.tryForTime(30 * 1000, async () => { await browser.goForward(); const forwardNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(forwardNavigationDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); }); diff --git a/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selector.ts similarity index 73% rename from x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts rename to x-pack/test/functional/apps/observability_logs_explorer/dataset_selector.ts index 1d7eae0129ce6..9e2dcd1d7c41c 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/dataset_selector.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/dataset_selector.ts @@ -26,7 +26,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const retry = getService('retry'); - const PageObjects = getPageObjects(['common', 'discover', 'observabilityLogExplorer']); + const PageObjects = getPageObjects(['common', 'discover', 'observabilityLogsExplorer']); const noIntegrationsTitle = 'No integrations found'; const noUncategorizedTitle = 'No data streams found'; @@ -34,7 +34,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Dataset Selector', () => { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); - await PageObjects.observabilityLogExplorer.removeInstalledPackages(); + await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); }); after(async () => { @@ -43,18 +43,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('as consistent behavior', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should always display the Integrations Uncategorized and Data Views top level tabs', async () => { - const integrationsTab = await PageObjects.observabilityLogExplorer.getIntegrationsTab(); - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); - const dataViewsTab = await PageObjects.observabilityLogExplorer.getDataViewsTab(); + const integrationsTab = await PageObjects.observabilityLogsExplorer.getIntegrationsTab(); + const uncategorizedTab = await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); + const dataViewsTab = await PageObjects.observabilityLogsExplorer.getDataViewsTab(); expect(await integrationsTab.isDisplayed()).to.be(true); expect(await integrationsTab.getVisibleText()).to.be('Integrations'); @@ -66,7 +66,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should always display the "Show all logs" action', async () => { const allLogDatasetButton = - await PageObjects.observabilityLogExplorer.getAllLogDatasetsButton(); + await PageObjects.observabilityLogsExplorer.getAllLogDatasetsButton(); const allLogDatasetTitle = await allLogDatasetButton.getVisibleText(); @@ -78,17 +78,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -100,14 +100,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no integrations', async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -119,10 +119,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { try { await browser.setNetworkConditions('SLOW_3G'); // Almost stuck network conditions const uncategorizedTab = - await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - await PageObjects.observabilityLogExplorer.assertLoadingSkeletonExists(); + await PageObjects.observabilityLogsExplorer.assertLoadingSkeletonExists(); await browser.restoreNetworkConditions(); } catch (error) { @@ -131,23 +131,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an error prompt if could not retrieve the datasets', async function () { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -159,18 +160,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no uncategorized data streams', async () => { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - const uncategorizedEntries = await PageObjects.observabilityLogExplorer + const uncategorizedEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(uncategorizedEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -182,31 +184,31 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); cleanupIntegrationsSetup = - await PageObjects.observabilityLogExplorer.setupInitialIntegrations(); + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); }); after(async () => { await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await cleanupIntegrationsSetup(); }); describe('when open on the integrations tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of installed integrations', async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(3); expect(integrations).to.eql(initialPackagesTexts); @@ -214,55 +216,55 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the integrations list by the clicked sorting option', async () => { // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts.slice().reverse()); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); }); it('should filter the integrations list by the typed integration name', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache, initialPackageMap.aws]); }); }); it('should display an empty prompt when the search does not match any result', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('no result search text'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('no result search text'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(0); }); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -270,28 +272,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load more integrations by scrolling to the end of the list', async () => { // Install more integrations and reload the page const cleanupAdditionalSetup = - await PageObjects.observabilityLogExplorer.setupAdditionalIntegrations(); + await PageObjects.observabilityLogsExplorer.setupAdditionalIntegrations(); await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); // Initially fetched integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(15); await nodes.at(-1)?.scrollIntoView(); }); // Load more integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); await nodes.at(-1)?.scrollIntoView(); }); // No other integrations to load after scrolling to last integration await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); }); @@ -300,28 +302,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('clicking on integration and moving into the second navigation level', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { const [panelTitleNode, integrationDatasetEntries] = - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -333,27 +335,27 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); @@ -361,12 +363,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('error'); @@ -374,12 +376,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); @@ -389,38 +391,38 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(1); @@ -430,25 +432,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be('access'); @@ -457,7 +459,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be('[Apache HTTP Server] access'); }); @@ -467,25 +469,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the uncategorized tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer .getUncategorizedTab() .then((tab: WebElementWrapper) => tab.click()); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -498,22 +500,22 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -522,12 +524,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[2]); @@ -536,12 +538,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -552,20 +554,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -573,13 +575,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[2].getVisibleText()).to.be(expectedUncategorized[2]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('retail'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('retail'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(1); @@ -589,20 +591,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); @@ -611,7 +613,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be(expectedUncategorized[0]); }); @@ -620,30 +622,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the data views tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer .getDataViewsTab() .then((tab: WebElementWrapper) => tab.click()); }); it('should display a list of available data views', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); @@ -655,26 +657,26 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the data views list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[2]); @@ -683,12 +685,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[0]); @@ -699,24 +701,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed data view name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[0].getVisibleText()).to.be(expectedDataViews[0]); @@ -724,13 +726,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[2].getVisibleText()).to.be(expectedDataViews[2]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('logs'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('logs'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(2); @@ -741,24 +743,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should navigate to Discover with the clicked data view preselected', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(await menuEntries[2].getVisibleText()).to.be(expectedDataViews[2]); @@ -775,27 +777,27 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open/close the selector', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should restore the latest navigation panel', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -804,16 +806,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -824,18 +826,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the latest search results', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); }); @@ -843,29 +845,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when switching between tabs or integration panels', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should remember the latest search and restore its results', async () => { - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer.clearSearchField(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.clearSearchField(); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('apache'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('apache'); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -874,13 +876,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); expect(menuEntries.length).to.be(1); @@ -888,32 +890,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Navigate back to integrations - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelTitle(menu) + PageObjects.observabilityLogsExplorer.getPanelTitle(menu) ); panelTitleNode.click(); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('apache'); nodes[0].click(); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu: WebElementWrapper) => - PageObjects.observabilityLogExplorer.getPanelEntries(menu) + PageObjects.observabilityLogsExplorer.getPanelEntries(menu) ); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('err'); expect(menuEntries.length).to.be(1); diff --git a/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts b/x-pack/test/functional/apps/observability_logs_explorer/filter_controls.ts similarity index 88% rename from x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts rename to x-pack/test/functional/apps/observability_logs_explorer/filter_controls.ts index 36087a23e8c4c..bb75b12004e77 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/filter_controls.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/filter_controls.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from './config'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); - const PageObjects = getPageObjects(['observabilityLogExplorer']); + const PageObjects = getPageObjects(['observabilityLogsExplorer']); const testSubjects = getService('testSubjects'); describe('Filter controls customization', () => { @@ -21,7 +21,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('renders a filter controls section as part of the unified search bar', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await testSubjects.existOrFail('datasetFiltersCustomization', { allowHidden: true }); }); }); diff --git a/x-pack/test/functional/apps/observability_log_explorer/flyout.ts b/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts similarity index 77% rename from x-pack/test/functional/apps/observability_log_explorer/flyout.ts rename to x-pack/test/functional/apps/observability_logs_explorer/flyout.ts index 11c161b5f4f8d..8e478755794a6 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/flyout.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts @@ -34,21 +34,21 @@ const docs = [ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer']); + const PageObjects = getPageObjects(['observabilityLogsExplorer']); describe('Flyout content customization', () => { let cleanupDataStreamSetup: () => Promise; before('initialize tests', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -67,30 +67,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should mount the flyout customization content', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutDetail'); + await testSubjects.existOrFail('logsExplorerFlyoutDetail'); }); it('should display a timestamp badge', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogTimestamp'); + await testSubjects.existOrFail('logsExplorerFlyoutLogTimestamp'); }); it('should display a log level badge when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.existOrFail('logsExplorerFlyoutLogLevel'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogLevel'); }); it('should display a message code block when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.existOrFail('logsExplorerFlyoutLogMessage'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogMessage'); }); }); } diff --git a/x-pack/test/functional/apps/observability_log_explorer/flyout_highlights.ts b/x-pack/test/functional/apps/observability_logs_explorer/flyout_highlights.ts similarity index 61% rename from x-pack/test/functional/apps/observability_log_explorer/flyout_highlights.ts rename to x-pack/test/functional/apps/observability_logs_explorer/flyout_highlights.ts index f0c457167c190..678c76bde9f2f 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/flyout_highlights.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/flyout_highlights.ts @@ -35,7 +35,7 @@ const sharedDoc = { export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer']); + const PageObjects = getPageObjects(['observabilityLogsExplorer']); describe('Flyout highlight customization', () => { let cleanupDataStreamSetup: () => Promise; @@ -61,11 +61,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutServiceName, docWithoutServiceInfraContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); after('clean up DataStream', async () => { @@ -75,7 +75,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -88,29 +88,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the service container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.existOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.existOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should load the service container even when 1 field is missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.missingOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should not load the service container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); await dataGrid.closeFlyout(); }); }); @@ -129,11 +129,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutCloudProviderAndInstanceId, docWithoutCloudContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); after('clean up DataStream', async () => { @@ -143,7 +143,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -156,36 +156,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the cloud container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); it('should load the cloud container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); await dataGrid.closeFlyout(); }); it('should not load the cloud container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); }); @@ -199,11 +199,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutLogPathAndAgentName]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); }); after('clean up DataStream', async () => { @@ -213,7 +213,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -226,23 +226,23 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the other container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); - await testSubjects.existOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); - await testSubjects.existOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutLogShipper'); await dataGrid.closeFlyout(); }); it('should load the other container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); - await testSubjects.missingOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.missingOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogShipper'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); await dataGrid.closeFlyout(); }); }); diff --git a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts b/x-pack/test/functional/apps/observability_logs_explorer/header_menu.ts similarity index 76% rename from x-pack/test/functional/apps/observability_log_explorer/header_menu.ts rename to x-pack/test/functional/apps/observability_logs_explorer/header_menu.ts index f5b7deb645da3..9bc4e090fb6cc 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/header_menu.ts @@ -13,36 +13,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const retry = getService('retry'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'timePicker']); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer', 'timePicker']); describe('Header menu', () => { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); after(async () => { await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); }); it('should inject the app header menu on the top navbar', async () => { - const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + const headerMenu = await PageObjects.observabilityLogsExplorer.getHeaderMenu(); expect(await headerMenu.isDisplayed()).to.be(true); }); describe('Discover fallback link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should render a button link ', async () => { - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); expect(await discoverLink.isDisplayed()).to.be(true); }); @@ -55,9 +55,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const timeConfig = await PageObjects.timePicker.getTimeConfig(); // Set query bar value - await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + await PageObjects.observabilityLogsExplorer.submitQuery('*favicon*'); - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); discoverLink.click(); await PageObjects.discover.waitForDocTableLoadingComplete(); @@ -79,23 +79,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await retry.try(async () => { - expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + expect(await PageObjects.observabilityLogsExplorer.getQueryBarValue()).to.eql( + '*favicon*' + ); }); }); }); describe('Add data link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should render a button link ', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); expect(await onboardingLink.isDisplayed()).to.be(true); }); it('should navigate to the observability onboarding overview page', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); onboardingLink.click(); await retry.try(async () => { diff --git a/x-pack/test/functional/apps/observability_log_explorer/index.ts b/x-pack/test/functional/apps/observability_logs_explorer/index.ts similarity index 93% rename from x-pack/test/functional/apps/observability_log_explorer/index.ts rename to x-pack/test/functional/apps/observability_logs_explorer/index.ts index c1114211b41a9..e8114a8d14bfd 100644 --- a/x-pack/test/functional/apps/observability_log_explorer/index.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from './config'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('Observability Log Explorer', function () { + describe('Observability Logs Explorer', function () { loadTestFile(require.resolve('./app')); loadTestFile(require.resolve('./columns_selection')); loadTestFile(require.resolve('./dataset_selection_state')); diff --git a/x-pack/test/functional/config.base.js b/x-pack/test/functional/config.base.js index 95849312e17da..1bf939c537b7c 100644 --- a/x-pack/test/functional/config.base.js +++ b/x-pack/test/functional/config.base.js @@ -170,8 +170,8 @@ export default async function ({ readConfigFile }) { observability: { pathname: '/app/observability', }, - observabilityLogExplorer: { - pathname: '/app/observability-log-explorer', + observabilityLogsExplorer: { + pathname: '/app/observability-logs-explorer', }, connectors: { pathname: '/app/management/insightsAndAlerting/triggersActionsConnectors/', diff --git a/x-pack/test/functional/es_archives/observability_log_explorer/data_streams/data.json.gz b/x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/data.json.gz similarity index 100% rename from x-pack/test/functional/es_archives/observability_log_explorer/data_streams/data.json.gz rename to x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/data.json.gz diff --git a/x-pack/test/functional/es_archives/observability_log_explorer/data_streams/mappings.json b/x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/mappings.json similarity index 100% rename from x-pack/test/functional/es_archives/observability_log_explorer/data_streams/mappings.json rename to x-pack/test/functional/es_archives/observability_logs_explorer/data_streams/mappings.json diff --git a/x-pack/test/functional/page_objects/index.ts b/x-pack/test/functional/page_objects/index.ts index b4ea0f741e117..30c8d9cd13e9d 100644 --- a/x-pack/test/functional/page_objects/index.ts +++ b/x-pack/test/functional/page_objects/index.ts @@ -33,7 +33,7 @@ import { LogstashPageObject } from './logstash_page'; import { MaintenanceWindowsPageProvider } from './maintenance_windows_page'; import { MonitoringPageObject } from './monitoring_page'; import { NavigationalSearchPageObject } from './navigational_search'; -import { ObservabilityLogExplorerPageObject } from './observability_log_explorer'; +import { ObservabilityLogsExplorerPageObject } from './observability_log_explorer'; import { ObservabilityPageProvider } from './observability_page'; import { RemoteClustersPageProvider } from './remote_clusters_page'; import { ReportingPageObject } from './reporting_page'; @@ -82,7 +82,7 @@ export const pageObjects = { maps: GisPageObject, monitoring: MonitoringPageObject, navigationalSearch: NavigationalSearchPageObject, - observabilityLogExplorer: ObservabilityLogExplorerPageObject, + observabilityLogsExplorer: ObservabilityLogsExplorerPageObject, observability: ObservabilityPageProvider, remoteClusters: RemoteClustersPageProvider, reporting: ReportingPageObject, diff --git a/x-pack/test/functional/page_objects/observability_log_explorer.ts b/x-pack/test/functional/page_objects/observability_log_explorer.ts index d6746ccd9e015..3f63b146756e6 100644 --- a/x-pack/test/functional/page_objects/observability_log_explorer.ts +++ b/x-pack/test/functional/page_objects/observability_log_explorer.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; import { - OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY, + OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY, urlSchemaV1, } from '@kbn/observability-logs-explorer-plugin/common'; import rison from '@kbn/rison'; @@ -114,7 +114,7 @@ const defaultPageState: urlSchemaV1.UrlSchema = { }, }; -export function ObservabilityLogExplorerPageObject({ +export function ObservabilityLogsExplorerPageObject({ getPageObjects, getService, }: FtrProviderContext) { @@ -215,7 +215,7 @@ export function ObservabilityLogExplorerPageObject({ pageState?: urlSchemaV1.UrlSchema; } = {}) { const queryStringParams = querystring.stringify({ - [OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY]: rison.encode( + [OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY]: rison.encode( urlSchemaV1.urlSchemaRT.encode({ ...defaultPageState, ...pageState, @@ -224,7 +224,7 @@ export function ObservabilityLogExplorerPageObject({ }); return await PageObjects.common.navigateToUrlWithBrowserHistory( - 'observabilityLogExplorer', + 'observabilityLogsExplorer', '/', queryStringParams, { @@ -241,7 +241,7 @@ export function ObservabilityLogExplorerPageObject({ pageState?: {}; } = {}) { const queryStringParams = querystring.stringify({ - [OBSERVABILITY_LOG_EXPLORER_URL_STATE_KEY]: rison.encode({ + [OBSERVABILITY_LOGS_EXPLORER_URL_STATE_KEY]: rison.encode({ ...uncheckedPageState, }), }); @@ -249,7 +249,7 @@ export function ObservabilityLogExplorerPageObject({ log.info('queryStringParams'); return await PageObjects.common.navigateToUrlWithBrowserHistory( - 'observabilityLogExplorer', + 'observabilityLogsExplorer', '/', queryStringParams, { @@ -330,7 +330,7 @@ export function ObservabilityLogExplorerPageObject({ async getFlyoutDetail(rowIndex: number = 0) { await dataGrid.clickRowToggle({ rowIndex }); - return testSubjects.find('logExplorerFlyoutDetail'); + return testSubjects.find('logsExplorerFlyoutDetail'); }, async getIntegrations() { @@ -416,15 +416,15 @@ export function ObservabilityLogExplorerPageObject({ }, getHeaderMenu() { - return testSubjects.find('logExplorerHeaderMenu'); + return testSubjects.find('logsExplorerHeaderMenu'); }, getDiscoverFallbackLink() { - return testSubjects.find('logExplorerDiscoverFallbackLink'); + return testSubjects.find('logsExplorerDiscoverFallbackLink'); }, getOnboardingLink() { - return testSubjects.find('logExplorerOnboardingLink'); + return testSubjects.find('logsExplorerOnboardingLink'); }, // Query Bar diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts index ee5f504d9f7ab..ad0b8b9c06b64 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/new_entity_flyout.cy.ts @@ -5,6 +5,10 @@ * 2.0. */ +import { + ENTRA_ID_PACKAGE_NAME, + OKTA_PACKAGE_NAME, +} from '@kbn/security-solution-plugin/public/timelines/components/side_panel/new_user_detail/constants'; import { expandFirstAlertHostFlyout, expandFirstAlertUserFlyout, @@ -14,7 +18,7 @@ import { import { login } from '../../tasks/login'; import { visitWithTimeRange } from '../../tasks/navigation'; import { ALERTS_URL } from '../../urls/navigation'; -import { USER_PANEL_HEADER } from '../../screens/hosts/flyout_user_panel'; +import { USER_PANEL_HEADER } from '../../screens/users/flyout_user_panel'; import { waitForAlerts } from '../../tasks/alerts'; import { HOST_PANEL_HEADER } from '../../screens/hosts/flyout_host_panel'; import { RISK_INPUT_PANEL_HEADER, ASSET_CRITICALITY_BADGE } from '../../screens/flyout_risk_panel'; @@ -28,6 +32,16 @@ import { ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_SELECTOR, } from '../../screens/asset_criticality/flyouts'; import { deleteCriticality } from '../../tasks/api_calls/entity_analytics'; +import { mockFleetInstalledIntegrations } from '../../tasks/fleet_integrations'; +import { + expandManagedDataEntraPanel, + expandManagedDataOktaPanel, +} from '../../tasks/users/flyout_user_panel'; +import { + ASSET_TYPE_FIELD, + ENTRA_DOCUMENT_TAB, + OKTA_DOCUMENT_TAB, +} from '../../screens/users/flyout_asset_panel'; const USER_NAME = 'user1'; const SIEM_KIBANA_HOST_NAME = 'Host-fwarau82er'; @@ -43,6 +57,7 @@ describe( 'newUserDetailsFlyout', 'newHostDetailsFlyout', 'entityAnalyticsAssetCriticalityEnabled', + 'newUserDetailsFlyoutManagedUser', ])}`, ], }, @@ -52,10 +67,12 @@ describe( before(() => { cy.task('esArchiverLoad', { archiveName: 'risk_scores_new_complete_data' }); cy.task('esArchiverLoad', { archiveName: 'query_alert', useCreate: true, docsOnly: true }); + cy.task('esArchiverLoad', { archiveName: 'user_managed_data' }); }); after(() => { cy.task('esArchiverUnload', 'risk_scores_new_complete_data'); + cy.task('esArchiverUnload', 'user_managed_data'); deleteAlertsAndRules(); // esArchiverUnload doesn't work properly when using with `useCreate` and `docsOnly` flags deleteCriticality({ idField: 'host.name', idValue: SIEM_KIBANA_HOST_NAME }); deleteCriticality({ idField: 'user.name', idValue: USER_NAME }); @@ -80,39 +97,73 @@ describe( cy.get(RISK_INPUT_PANEL_HEADER).should('exist'); }); - it('should show asset criticality in the risk input panel', () => { - expandFirstAlertUserFlyout(); - expandRiskInputsFlyoutPanel(); - cy.get(ASSET_CRITICALITY_BADGE).should('contain.text', 'Very important'); - }); - - it('should display asset criticality accordion', () => { - cy.log('asset criticality'); - expandFirstAlertUserFlyout(); - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_SELECTOR).should( - 'contain.text', - 'Asset Criticality' - ); - - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_BUTTON).should('have.text', 'Create'); - }); - it('should display asset criticality modal', () => { - cy.log('asset criticality modal'); - expandFirstAlertUserFlyout(); - toggleAssetCriticalityModal(); - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_MODAL_TITLE).should( - 'have.text', - 'Pick asset criticality level' - ); + describe('Asset criticality', () => { + it('should show asset criticality in the risk input panel', () => { + expandFirstAlertUserFlyout(); + expandRiskInputsFlyoutPanel(); + cy.get(ASSET_CRITICALITY_BADGE).should('contain.text', 'Very important'); + }); + + it('should display asset criticality accordion', () => { + cy.log('asset criticality'); + expandFirstAlertUserFlyout(); + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_SELECTOR).should( + 'contain.text', + 'Asset Criticality' + ); + + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_BUTTON).should('have.text', 'Create'); + }); + + it('should display asset criticality modal', () => { + cy.log('asset criticality modal'); + expandFirstAlertUserFlyout(); + toggleAssetCriticalityModal(); + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_MODAL_TITLE).should( + 'have.text', + 'Pick asset criticality level' + ); + }); + + it('should update asset criticality state', () => { + cy.log('asset criticality update'); + expandFirstAlertUserFlyout(); + selectAssetCriticalityLevel('Important'); + cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_LEVEL) + .contains('Important') + .should('be.visible'); + }); }); - it('should update asset criticality state', () => { - cy.log('asset criticality update'); - expandFirstAlertUserFlyout(); - selectAssetCriticalityLevel('Important'); - cy.get(ENTITY_DETAILS_FLYOUT_ASSET_CRITICALITY_LEVEL) - .contains('Important') - .should('be.visible'); + describe('Managed data section', () => { + beforeEach(() => { + mockFleetInstalledIntegrations([ + { + package_name: ENTRA_ID_PACKAGE_NAME, + is_enabled: true, + package_title: 'azure entra', + package_version: 'test_package_version', + }, + { + package_name: OKTA_PACKAGE_NAME, + is_enabled: true, + package_title: 'okta', + package_version: 'test_package_version', + }, + ]); + }); + + it('should show okta and azure managed data sections and expand panel', () => { + expandFirstAlertUserFlyout(); + + expandManagedDataEntraPanel(); + cy.get(ENTRA_DOCUMENT_TAB).should('have.attr', 'aria-selected'); + cy.get(ASSET_TYPE_FIELD).should('contain.text', 'microsoft_entra_id_user'); + + expandManagedDataOktaPanel(); + cy.get(OKTA_DOCUMENT_TAB).should('have.attr', 'aria-selected'); + cy.get(ASSET_TYPE_FIELD).should('contain.text', 'okta_user'); + }); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_asset_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_asset_panel.ts new file mode 100644 index 0000000000000..d83ad90de215e --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_asset_panel.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getDataTestSubjectSelector } from '../../helpers/common'; + +export const ASSET_TYPE_FIELD = getDataTestSubjectSelector('event-field-asset.type'); + +export const OKTA_DOCUMENT_TAB = getDataTestSubjectSelector('securitySolutionFlyoutOktaTab'); + +export const ENTRA_DOCUMENT_TAB = getDataTestSubjectSelector('securitySolutionFlyoutEntraTab'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_user_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_user_panel.ts new file mode 100644 index 0000000000000..40507311d424d --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/screens/users/flyout_user_panel.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getDataTestSubjectSelector } from '../../helpers/common'; + +export const USER_PANEL_HEADER = getDataTestSubjectSelector('user-panel-header'); + +const MANAGED_DATA_SECTION = getDataTestSubjectSelector('managedUser-data'); + +export const OKTA_MANAGED_DATA_TITLE = `${MANAGED_DATA_SECTION} ${getDataTestSubjectSelector( + 'managed-user-accordion-userAssetOktaLeftSection' +)}`; + +export const ENTRA_MANAGED_DATA_TITLE = `${MANAGED_DATA_SECTION} ${getDataTestSubjectSelector( + 'managed-user-accordion-userAssetEntraLeftSection' +)}`; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/fleet_integrations.ts b/x-pack/test/security_solution_cypress/cypress/tasks/fleet_integrations.ts new file mode 100644 index 0000000000000..bafc80b383547 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/tasks/fleet_integrations.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + GET_INSTALLED_INTEGRATIONS_URL, + InstalledIntegration, +} from '@kbn/security-solution-plugin/common/api/detection_engine'; + +export const mockFleetInstalledIntegrations = (integrations: InstalledIntegration[] = []) => { + cy.intercept('GET', `${GET_INSTALLED_INTEGRATIONS_URL}*`, { + statusCode: 200, + body: { + installed_integrations: integrations, + }, + }).as('installedIntegrations'); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/users/flyout_user_panel.ts b/x-pack/test/security_solution_cypress/cypress/tasks/users/flyout_user_panel.ts new file mode 100644 index 0000000000000..4d9e4a3897a35 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/tasks/users/flyout_user_panel.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ENTRA_MANAGED_DATA_TITLE, + OKTA_MANAGED_DATA_TITLE, +} from '../../screens/users/flyout_user_panel'; + +export const expandManagedDataEntraPanel = () => { + cy.get(ENTRA_MANAGED_DATA_TITLE).click(); +}; + +export const expandManagedDataOktaPanel = () => { + cy.get(OKTA_MANAGED_DATA_TITLE).click(); +}; diff --git a/x-pack/test/security_solution_cypress/es_archives/user_managed_data/data.json b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/data.json new file mode 100644 index 0000000000000..ef3db8154650d --- /dev/null +++ b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/data.json @@ -0,0 +1,220 @@ +{ + "type": "doc", + "value": { + "id": "IYAoRo0BywOJt6WJ-NXN", + "data_stream": "logs-entityanalytics_okta.user-default", + "index": ".ds-logs-entityanalytics_okta.user-default-000001", + "source": { + "agent": { + "name": "docker-fleet-server", + "id": "62489a87-bbb5-44d1-9dd5-63c508de884b", + "type": "filebeat", + "ephemeral_id": "ea069592-b9bb-4e85-bf22-ec67bdb10394", + "version": "8.12.0" + }, + "elastic_agent": { + "id": "62489a87-bbb5-44d1-9dd5-63c508de884b", + "version": "8.12.0", + "snapshot": true + }, + "entityanalytics_okta": { + "user": { + "_links": { + "self": { + "href": "https://dev-36006609.okta.com/api/v1/users/00udojsvifqsBhoxR5d7" + } + }, + "type": { + "id": "otyf1r6hlGf9AXhZ95d6" + } + } + }, + "labels": { + "identity_source": "entity-analytics-entityanalytics_okta.user-73e543b5-2de4-41f8-9e7f-a9d1dbd1857c" + }, + "tags": [ + "forwarded", + "entityanalytics_okta-user" + ], + "input": { + "type": "entity-analytics" + }, + "@timestamp": "2024-01-26T14:24:56.744Z", + "ecs": { + "version": "8.11.0" + }, + "related": { + "user": [ + "00udojsvifqsBhoxR5d7", + "user1@gmail.com", + "test", + "123" + ] + }, + "data_stream": { + "namespace": "default", + "type": "logs", + "dataset": "entityanalytics_okta.user" + }, + "event": { + "agent_id_status": "verified", + "ingested": "2024-01-26T14:25:06Z", + "kind": "asset", + "action": "user-modified", + "category": [ + "iam" + ], + "type": [ + "user", + "info" + ], + "dataset": "entityanalytics_okta.user" + }, + "asset": { + "last_updated": "2023-12-06T13:45:09.000Z", + "last_seen": "2023-12-06T13:45:09.000Z", + "last_status_change_date": "2023-12-06T13:45:09.000Z", + "id": "00udojsvifqsBhoxR5d7", + "category": "entity", + "type": "okta_user", + "create_date": "2023-12-06T13:44:23.000Z", + "status": "ACTIVE" + }, + "user": { + "profile": { + "last_name": "123", + "first_name": "test", + "status": "ACTIVE" + }, + "name": "user1", + "id": "00udojsvifqsBhoxR5d7", + "account": { + "change_date": "2023-12-06T13:45:09.000Z", + "password_change_date": "2023-12-06T13:45:09.000Z", + "activated_date": "2023-12-06T13:44:23.000Z", + "create_date": "2023-12-06T13:44:23.000Z", + "status": { + "password_expired": false, + "deprovisioned": false, + "locked_out": false, + "recovery": false, + "suspended": false + } + }, + "email": "user1@gmail.com" + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "uYSkRo0Bc35HUGZSHMQR", + "data_stream": "logs-entityanalytics_entra_id.user-default", + "index": ".ds-logs-entityanalytics_entra_id.user-default", + "source": { + "agent": { + "name": "ingest-linux-1", + "id": "adb765aa-365b-4f27-8111-bca5bf3d51d3", + "type": "filebeat", + "ephemeral_id": "3228f5dd-b26b-4eae-b8ff-1d3941688e0a", + "version": "8.12.0" + }, + "elastic_agent": { + "id": "adb765aa-365b-4f27-8111-bca5bf3d51d3", + "version": "8.12.0", + "snapshot": true + }, + "labels": { + "identity_source": "entity-analytics-entityanalytics_entra_id.entity-297a838e-1c2d-42f1-8c47-c576bc5424d3" + }, + "tags": [ + "users-entities", + "forwarded", + "entityanalytics_entra_id-entity" + ], + "cloud": { + "availability_zone": "us-central1-c", + "instance": { + "name": "ingest-linux-1", + "id": "8765304135675025125" + }, + "provider": "gcp", + "service": { + "name": "GCE" + }, + "machine": { + "type": "n1-standard-1" + }, + "project": { + "id": "elastic-siem" + }, + "region": "us-central1", + "account": { + "id": "elastic-siem" + } + }, + "input": { + "type": "entity-analytics" + }, + "@timestamp": "2024-01-29T08:39:39.340Z", + "ecs": { + "version": "8.11.0" + }, + "related": { + "user": [ + "user1@elastic.co", + "user1_elastic.co#EXT#@azure2elasticsearch.onmicrosoft.com", + "user1", + "b6bcbd11-7e2b-4d6a-9dbe-f3c487c6cf7a" + ] + }, + "data_stream": { + "namespace": "default", + "type": "logs", + "dataset": "entityanalytics_entra_id.user" + }, + "event": { + "agent_id_status": "verified", + "ingested": "2024-01-29T08:39:49Z", + "kind": "asset", + "action": "user-modified", + "category": [ + "iam" + ], + "type": [ + "user", + "info" + ], + "dataset": "entityanalytics_entra_id.user" + }, + "asset": { + "id": "b6bcbd11-7e2b-4d6a-9dbe-f3c487c6cf7a", + "category": "entity", + "type": "microsoft_entra_id_user", + "group": [ + { + "name": "obs-integrations", + "id": "ee4d999c-57f2-4213-adac-6192582b8649" + } + ] + }, + "user": { + "full_name": "user1 Test", + "name": "user1", + "last_name": "Test", + "id": "b6bcbd11-7e2b-4d6a-9dbe-f3c487c6cf7a", + "first_name": "user1", + "job_title": "user1@elastic.co", + "email": "user1@elastic.co", + "group": [ + { + "name": "obs-integrations", + "id": "ee4d999c-57f2-4213-adac-6192582b8649" + } + ] + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_solution_cypress/es_archives/user_managed_data/mappings.json b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/mappings.json new file mode 100644 index 0000000000000..c8d6c4ad73294 --- /dev/null +++ b/x-pack/test/security_solution_cypress/es_archives/user_managed_data/mappings.json @@ -0,0 +1,1277 @@ +{ + "type": "data_stream", + "value": { + "data_stream": "logs-entityanalytics_okta.user-default", + "template": { + "_meta": { + "managed": true, + "namespace": "default" + }, + "data_stream": { + "hidden": false + }, + "index_patterns": [ + "logs-entityanalytics_okta.user-default" + ], + "name": "logs-entityanalytics_okta.user-default-index-template", + "template": { + "mappings": { + "dynamic": false, + "properties": { + "@timestamp": { + "type": "date", + "ignore_malformed": false + }, + "agent": { + "properties": { + "ephemeral_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "asset": { + "properties": { + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "costCenter": { + "type": "keyword", + "ignore_above": 1024 + }, + "create_date": { + "type": "date" + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_seen": { + "type": "date" + }, + "last_status_change_date": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "vendor": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "data_stream": { + "properties": { + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_okta.user" + }, + "namespace": { + "type": "constant_keyword", + "value": "default" + }, + "type": { + "type": "constant_keyword", + "value": "logs" + } + } + }, + "ecs": { + "properties": { + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "elastic_agent": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "snapshot": { + "type": "boolean" + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "entityanalytics_okta": { + "properties": { + "user": { + "properties": { + "_embedded": { + "type": "flattened" + }, + "_links": { + "type": "flattened" + }, + "activated": { + "type": "date" + }, + "created": { + "type": "date" + }, + "credentials": { + "properties": { + "provider": { + "properties": { + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_login": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "password_changed": { + "type": "date" + }, + "profile": { + "properties": { + "city": { + "type": "keyword", + "ignore_above": 1024 + }, + "cost_center": { + "type": "keyword", + "ignore_above": 1024 + }, + "country_code": { + "type": "keyword", + "ignore_above": 1024 + }, + "department": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "division": { + "type": "keyword", + "ignore_above": 1024 + }, + "email": { + "type": "keyword", + "ignore_above": 1024 + }, + "employee_number": { + "type": "keyword", + "ignore_above": 1024 + }, + "first_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "honorific": { + "properties": { + "prefix": { + "type": "keyword", + "ignore_above": 1024 + }, + "suffix": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "last_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "locale": { + "type": "keyword", + "ignore_above": 1024 + }, + "login": { + "type": "keyword", + "ignore_above": 1024 + }, + "manager": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "middle_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "nick_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "organization": { + "type": "keyword", + "ignore_above": 1024 + }, + "postal_address": { + "type": "keyword", + "ignore_above": 1024 + }, + "preferred_language": { + "type": "keyword", + "ignore_above": 1024 + }, + "primary_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "second_email": { + "type": "keyword", + "ignore_above": 1024 + }, + "state": { + "type": "keyword", + "ignore_above": 1024 + }, + "street_address": { + "type": "keyword", + "ignore_above": 1024 + }, + "timezone": { + "type": "keyword", + "ignore_above": 1024 + }, + "title": { + "type": "keyword", + "ignore_above": 1024 + }, + "url": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "zip_code": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "status_changed": { + "type": "date" + }, + "transitioning_to_status": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "flattened" + } + } + } + } + }, + "event": { + "properties": { + "action": { + "type": "keyword", + "ignore_above": 1024 + }, + "agent_id_status": { + "type": "keyword", + "ignore_above": 1024 + }, + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_okta.user" + }, + "end": { + "type": "date" + }, + "ingested": { + "type": "date", + "format": "strict_date_time_no_millis||strict_date_optional_time||epoch_millis" + }, + "kind": { + "type": "keyword", + "ignore_above": 1024 + }, + "module": { + "type": "constant_keyword", + "value": "entityanalytics_okta" + }, + "start": { + "type": "date" + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "input": { + "properties": { + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "labels": { + "properties": { + "identity_source": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "log": { + "properties": { + "offset": { + "type": "long" + } + } + }, + "related": { + "properties": { + "user": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "properties": { + "account": { + "properties": { + "activated_date": { + "type": "date" + }, + "change_date": { + "type": "date" + }, + "create_date": { + "type": "date" + }, + "password_change_date": { + "type": "date" + }, + "status": { + "properties": { + "deprovisioned": { + "type": "boolean" + }, + "locked_out": { + "type": "boolean" + }, + "password_expired": { + "type": "boolean" + }, + "recovery": { + "type": "boolean" + }, + "suspended": { + "type": "boolean" + } + } + } + } + }, + "email": { + "type": "keyword", + "ignore_above": 1024 + }, + "full_name": { + "type": "keyword", + "fields": { + "text": { + "type": "match_only_text" + } + } + }, + "geo": { + "properties": { + "city_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "country_iso_code": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "postal_code": { + "type": "keyword", + "ignore_above": 1024 + }, + "region_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "timezone": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "fields": { + "text": { + "type": "match_only_text" + } + } + }, + "organization": { + "properties": { + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "profile": { + "properties": { + "department": { + "type": "keyword", + "ignore_above": 1024 + }, + "first_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "manager": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "other_identities": { + "type": "keyword", + "ignore_above": 1024 + }, + "primaryPhone": { + "type": "keyword", + "ignore_above": 1024 + }, + "secondEmail": { + "type": "keyword", + "ignore_above": 1024 + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + } + } + } + } + } + } +} + +{ + "type": "data_stream", + "value": { + "data_stream": "logs-entityanalytics_entra_id.user-default", + "template": { + "_meta": { + "managed": true, + "namespace": "default" + }, + "data_stream": { + "hidden": false + }, + "index_patterns": [ + "logs-entityanalytics_entra_id.user-default" + ], + "name": "logs-entityanalytics_entra_id.user-default-index-template", + "template": { + "mappings": { + "dynamic": false, + "properties": { + "@timestamp": { + "type": "date", + "ignore_malformed": false + }, + "agent": { + "properties": { + "ephemeral_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "asset": { + "properties": { + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "first_seen": { + "type": "date" + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "is_managed": { + "type": "boolean" + }, + "last_seen": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "model": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "status": { + "type": "keyword", + "ignore_above": 1024 + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "vendor": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "cloud": { + "properties": { + "account": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "availability_zone": { + "type": "keyword", + "ignore_above": 1024 + }, + "instance": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "fields": { + "text": { + "type": "match_only_text" + } + } + } + } + }, + "machine": { + "properties": { + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "project": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "provider": { + "type": "keyword", + "ignore_above": 1024 + }, + "region": { + "type": "keyword", + "ignore_above": 1024 + }, + "service": { + "properties": { + "name": { + "type": "keyword" + } + } + } + } + }, + "data_stream": { + "properties": { + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_entra_id.entity" + }, + "namespace": { + "type": "constant_keyword", + "value": "default" + }, + "type": { + "type": "constant_keyword", + "value": "logs" + } + } + }, + "device": { + "properties": { + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registered_owners": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registered_users": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "ecs": { + "properties": { + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "elastic_agent": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "snapshot": { + "type": "boolean" + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "entityanalytics_entra_id": { + "properties": { + "device": { + "dynamic": "true", + "properties": { + "account_enabled": { + "type": "boolean" + }, + "alternative_security_ids": { + "properties": { + "identity_provider": { + "type": "keyword", + "ignore_above": 1024 + }, + "key": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "long" + } + } + }, + "approximate_last_sign_in_date_time": { + "type": "date" + }, + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "compliance_expiration_date_time": { + "type": "date" + }, + "d_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "enrollment_profile_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "extension_attributes": { + "type": "object", + "dynamic": "true" + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "is_compliant": { + "type": "boolean" + }, + "is_managed": { + "type": "boolean" + }, + "manufacturer": { + "type": "keyword", + "ignore_above": 1024 + }, + "mdm_app_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "metadata": { + "type": "keyword", + "ignore_above": 1024 + }, + "model": { + "type": "keyword", + "ignore_above": 1024 + }, + "on_premises_last_sync_date_time": { + "type": "date" + }, + "on_premises_sync_enabled": { + "type": "boolean" + }, + "operating_system": { + "type": "keyword", + "ignore_above": 1024 + }, + "operating_system_version": { + "type": "keyword", + "ignore_above": 1024 + }, + "ownership": { + "type": "keyword", + "ignore_above": 1024 + }, + "physical_ids": { + "type": "keyword", + "ignore_above": 1024 + }, + "profile_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "registered_owners": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registered_users": { + "properties": { + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "registration_date_time": { + "type": "date" + }, + "system_labels": { + "type": "keyword", + "ignore_above": 1024 + }, + "trust_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "user": { + "properties": { + "account_enabled": { + "type": "boolean" + }, + "business_phones": { + "type": "keyword", + "ignore_above": 1024 + }, + "display_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "given_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "mail": { + "type": "keyword", + "ignore_above": 1024 + }, + "mobile_phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "office_location": { + "type": "keyword", + "ignore_above": 1024 + }, + "preferred_language": { + "type": "keyword", + "ignore_above": 1024 + }, + "surname": { + "type": "keyword", + "ignore_above": 1024 + }, + "user_principal_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "event": { + "properties": { + "action": { + "type": "keyword", + "ignore_above": 1024 + }, + "agent_id_status": { + "type": "keyword", + "ignore_above": 1024 + }, + "dataset": { + "type": "constant_keyword", + "value": "entityanalytics_entra_id.entity" + }, + "end": { + "type": "date" + }, + "ingested": { + "type": "date", + "format": "strict_date_time_no_millis||strict_date_optional_time||epoch_millis" + }, + "kind": { + "type": "keyword", + "ignore_above": 1024 + }, + "message": { + "type": "text" + }, + "module": { + "type": "constant_keyword", + "value": "entityanalytics_entra_id" + }, + "provider": { + "type": "constant_keyword", + "value": "Microsoft Entra ID" + }, + "start": { + "type": "date" + } + } + }, + "input": { + "properties": { + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "labels": { + "properties": { + "identity_source": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "log": { + "properties": { + "file": { + "properties": { + "path": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "flags": { + "type": "keyword", + "ignore_above": 1024 + }, + "offset": { + "type": "long" + } + } + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "properties": { + "enabled": { + "type": "boolean" + }, + "first_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "group": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "job_title": { + "type": "keyword", + "ignore_above": 1024 + }, + "last_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "phone": { + "type": "keyword", + "ignore_above": 1024 + }, + "work": { + "properties": { + "location_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts index 696c48183624a..71b7bacd2e8a3 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/agent_type_support.ts @@ -12,7 +12,7 @@ import { targetTags } from '../../../security_solution_endpoint/target_tags'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - describe('Response Actions support for agentType', function () { + describe('Response Actions support for sentinelOne agentType', function () { targetTags(this, ['@ess', '@serverless']); describe('and the "responseActionsSentinelOneV1Enabled" feature flag is disabled', () => { @@ -22,7 +22,7 @@ export default function ({ getService }: FtrProviderContext) { .post(ISOLATE_HOST_ROUTE_V2) .set('kbn-xsrf', 'true') .set('Elastic-Api-Version', '2023-10-31') - .send({ endpoint_ids: ['test'], agent_type: 'endpoint' }) + .send({ endpoint_ids: ['test'], agent_type: 'sentinel_one' }) .expect(400, { statusCode: 400, error: 'Bad Request', diff --git a/x-pack/test_serverless/functional/config.base.ts b/x-pack/test_serverless/functional/config.base.ts index 51227434fd377..7827714dea55d 100644 --- a/x-pack/test_serverless/functional/config.base.ts +++ b/x-pack/test_serverless/functional/config.base.ts @@ -60,8 +60,8 @@ export function createTestConfig(options: CreateTestConfigOptions) { observability: { pathname: '/app/observability', }, - observabilityLogExplorer: { - pathname: '/app/observability-log-explorer', + observabilityLogsExplorer: { + pathname: '/app/observability-logs-explorer', }, management: { pathname: '/app/management', diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts index 9768eb43e76ca..e301266dcd168 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts @@ -150,7 +150,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - describe('query #2, which has an empty time range', () => { + // FLAKY: https://github.com/elastic/kibana/issues/173292 + // FLAKY: https://github.com/elastic/kibana/issues/173784 + describe.skip('query #2, which has an empty time range', () => { const fromTime = 'Jun 11, 1999 @ 09:22:11.000'; const toTime = 'Jun 12, 1999 @ 11:21:04.000'; diff --git a/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts b/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts index 8453042cc7161..88190fa496156 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cypress/e2e/navigation.cy.ts @@ -27,7 +27,7 @@ describe.skip('Serverless', () => { cy.loginAsElasticUser(); cy.contains('Logs Explorer').click(); - cy.url().should('include', '/app/observability-log-explorer'); + cy.url().should('include', '/app/observability-logs-explorer'); cy.contains('Dashboards').click(); cy.url().should('include', '/app/dashboards'); diff --git a/x-pack/test_serverless/functional/test_suites/observability/index.ts b/x-pack/test_serverless/functional/test_suites/observability/index.ts index 992ace677b01c..c8e82d6017636 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/index.ts @@ -11,7 +11,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless observability UI', function () { loadTestFile(require.resolve('./landing_page')); loadTestFile(require.resolve('./navigation')); - loadTestFile(require.resolve('./observability_log_explorer')); + loadTestFile(require.resolve('./observability_logs_explorer')); loadTestFile(require.resolve('./rules/rules_list')); loadTestFile(require.resolve('./cases')); loadTestFile(require.resolve('./advanced_settings')); diff --git a/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts b/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts index 68263e5ce2c39..07471b17e11c0 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/landing_page.ts @@ -13,7 +13,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlObltNavigation = getService('svlObltNavigation'); const SvlObltOnboardingStreamLogFilePage = getPageObject('SvlObltOnboardingStreamLogFilePage'); - describe('landing page', function () { + // FLAKY: https://github.com/elastic/kibana/issues/168037 + describe.skip('landing page', function () { before(async () => { await svlCommonPage.login(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts index f899d6760db02..302a786286ae5 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts @@ -42,14 +42,14 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.sidenav.expectSectionClosed('project_settings_project_nav'); // navigate to the logs explorer tab by default - await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-log-explorer' }); + await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-logs-explorer' }); await svlCommonNavigation.sidenav.expectLinkActive({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); - expect(await browser.getCurrentUrl()).contain('/app/observability-log-explorer'); + expect(await browser.getCurrentUrl()).contain('/app/observability-logs-explorer'); // check the aiops subsection await svlCommonNavigation.sidenav.openSection('observability_project_nav.aiops'); // open ai ops subsection diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/app.ts similarity index 92% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/app.ts index 4a1cf5024ff4d..6f98ca40aa0fc 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/app.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/app.ts @@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const PageObjects = getPageObjects([ - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonNavigation', 'svlCommonPage', ]); @@ -28,10 +28,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('is shown in the global search', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.svlCommonNavigation.search.showSearch(); - await PageObjects.svlCommonNavigation.search.searchFor('log explorer'); + await PageObjects.svlCommonNavigation.search.searchFor('logs explorer'); const results = await PageObjects.svlCommonNavigation.search.getDisplayedResults(); expect(results[0].label).to.eql('Logs Explorer'); @@ -44,7 +44,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const to = '2023-08-03T10:24:14.091Z'; const COUNT = 5; await synthtrace.index(generateLogsData({ from, to, count: COUNT })); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); const docCount = await dataGrid.getDocCount(); expect(docCount).to.be(COUNT); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/columns_selection.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts similarity index 97% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/columns_selection.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts index 97b33e956a7e0..1f28612efb6db 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/columns_selection.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts @@ -13,7 +13,7 @@ const defaultLogColumns = ['@timestamp', 'resource', 'content']; export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); - const PageObjects = getPageObjects(['discover', 'observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['discover', 'observabilityLogsExplorer', 'svlCommonPage']); const synthtrace = getService('svlLogsSynthtraceClient'); const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); @@ -22,7 +22,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const TEST_TIMEOUT = 10 * 1000; // 10 secs const navigateToLogExplorer = () => - PageObjects.observabilityLogExplorer.navigateTo({ + PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -32,7 +32,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }, }); - describe('When the log explorer loads', () => { + describe('When the logs explorer loads', () => { before(async () => { await synthtrace.index(generateLogsData({ to })); await PageObjects.svlCommonPage.login(); @@ -52,7 +52,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the table columns from the URL state if exists', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from, @@ -125,7 +125,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(cellValue.includes('event.original')).to.be(false); const cellAttribute = await cellElement.findByTestSubject( - 'logExplorerCellDescriptionList' + 'logsExplorerCellDescriptionList' ); expect(cellAttribute).not.to.be.empty(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selection_state.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selection_state.ts similarity index 78% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selection_state.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selection_state.ts index b6088ebb6a3d7..53b25cf5011ff 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selection_state.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selection_state.ts @@ -27,7 +27,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const PageObjects = getPageObjects([ 'common', - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonPage', 'header', ]); @@ -43,10 +43,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when no dataset selection is given', () => { it('should initialize the "All logs" selection', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('All logs'); }); @@ -54,7 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when a dataset selection is given', () => { it('should decode and restore the selection from a valid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, @@ -62,13 +62,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(datasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); it('should fallback to the "All logs" selection and notify the user of an invalid encoded index', async () => { - await PageObjects.observabilityLogExplorer.navigateToWithUncheckedState({ + await PageObjects.observabilityLogsExplorer.navigateToWithUncheckedState({ pageState: { v: 1, datasetSelection: { @@ -79,29 +79,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.header.waitUntilLoadingHasFinished(); const datasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); - await PageObjects.observabilityLogExplorer.assertRestoreFailureToastExist(); + await PageObjects.observabilityLogsExplorer.assertRestoreFailureToastExist(); expect(datasetSelectionTitle).to.be('All logs'); }); }); describe('when navigating back and forth on the page history', () => { it('should decode and restore the selection for the current index', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); const allDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(allDatasetSelectionTitle).to.be('All logs'); - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { datasetSelection: azureActivityDatasetSelection, }, }); await PageObjects.header.waitUntilLoadingHasFinished(); const azureDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(azureDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); // Go back to previous page selection @@ -109,7 +109,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await browser.goBack(); await PageObjects.header.waitUntilLoadingHasFinished(); const backNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(backNavigationDatasetSelectionTitle).to.be('All logs'); }); @@ -118,7 +118,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await browser.goForward(); await PageObjects.header.waitUntilLoadingHasFinished(); const forwardNavigationDatasetSelectionTitle = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButtonText(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButtonText(); expect(forwardNavigationDatasetSelectionTitle).to.be('[Azure Logs] activitylogs'); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selector.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selector.ts similarity index 70% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selector.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selector.ts index de0f3b24d9a35..a0b5a5d0bc8cd 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/dataset_selector.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/dataset_selector.ts @@ -27,7 +27,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects([ 'common', 'discover', - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonPage', ]); @@ -39,7 +39,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { this.tags(['failsOnMKI']); before(async () => { await PageObjects.svlCommonPage.login(); - await PageObjects.observabilityLogExplorer.removeInstalledPackages(); + await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); }); after(async () => { @@ -48,18 +48,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('as consistent behavior', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should always display the Integrations, Uncategorized and Data Views top level tabs', async () => { - const integrationsTab = await PageObjects.observabilityLogExplorer.getIntegrationsTab(); - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); - const dataViewsTab = await PageObjects.observabilityLogExplorer.getDataViewsTab(); + const integrationsTab = await PageObjects.observabilityLogsExplorer.getIntegrationsTab(); + const uncategorizedTab = await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); + const dataViewsTab = await PageObjects.observabilityLogsExplorer.getDataViewsTab(); expect(await integrationsTab.isDisplayed()).to.be(true); expect(await integrationsTab.getVisibleText()).to.be('Integrations'); @@ -71,7 +71,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should always display the "Show all logs" action', async () => { const allLogDatasetButton = - await PageObjects.observabilityLogExplorer.getAllLogDatasetsButton(); + await PageObjects.observabilityLogsExplorer.getAllLogDatasetsButton(); const allLogDatasetTitle = await allLogDatasetButton.getVisibleText(); @@ -83,17 +83,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -105,12 +105,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no integrations', async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -122,10 +122,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { try { await browser.setNetworkConditions('SLOW_3G'); // Almost stuck network conditions const uncategorizedTab = - await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - await PageObjects.observabilityLogExplorer.assertLoadingSkeletonExists(); + await PageObjects.observabilityLogsExplorer.assertLoadingSkeletonExists(); await browser.restoreNetworkConditions(); } catch (error) { @@ -134,23 +134,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an error prompt if could not retrieve the datasets', async function () { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); // Skip the test in case network condition utils are not available try { await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); await PageObjects.common.sleep(5000); await browser.setNetworkConditions('OFFLINE'); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - await PageObjects.observabilityLogExplorer.assertListStatusErrorPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusErrorPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -162,16 +163,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display an empty prompt for no uncategorized data streams', async () => { - const uncategorizedTab = await PageObjects.observabilityLogExplorer.getUncategorizedTab(); + const uncategorizedTab = + await PageObjects.observabilityLogsExplorer.getUncategorizedTab(); await uncategorizedTab.click(); - const uncategorizedEntries = await PageObjects.observabilityLogExplorer + const uncategorizedEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(uncategorizedEntries.length).to.be(0); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noUncategorizedTitle ); }); @@ -183,31 +185,31 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); cleanupIntegrationsSetup = - await PageObjects.observabilityLogExplorer.setupInitialIntegrations(); + await PageObjects.observabilityLogsExplorer.setupInitialIntegrations(); }); after(async () => { await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await cleanupIntegrationsSetup(); }); describe('when open on the integrations tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of installed integrations', async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(3); expect(integrations).to.eql(initialPackagesTexts); @@ -215,55 +217,55 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the integrations list by the clicked sorting option', async () => { // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts.slice().reverse()); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql(initialPackagesTexts); }); }); it('should filter the integrations list by the typed integration name', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('a'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('a'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache, initialPackageMap.aws]); }); }); it('should display an empty prompt when the search does not match any result', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('no result search text'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('no result search text'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations.length).to.be(0); }); - await PageObjects.observabilityLogExplorer.assertListStatusEmptyPromptExistsWithTitle( + await PageObjects.observabilityLogsExplorer.assertListStatusEmptyPromptExistsWithTitle( noIntegrationsTitle ); }); @@ -271,28 +273,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load more integrations by scrolling to the end of the list', async () => { // Install more integrations and reload the page const cleanupAdditionalSetup = - await PageObjects.observabilityLogExplorer.setupAdditionalIntegrations(); + await PageObjects.observabilityLogsExplorer.setupAdditionalIntegrations(); await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); // Initially fetched integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(15); await nodes.at(-1)?.scrollIntoView(); }); // Load more integrations await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); await nodes.at(-1)?.scrollIntoView(); }); // No other integrations to load after scrolling to last integration await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(nodes.length).to.be(20); }); @@ -301,28 +303,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('clicking on integration and moving into the second navigation level', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { const [panelTitleNode, integrationDatasetEntries] = - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -334,46 +336,46 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('error'); expect(await menuEntries[1].getVisibleText()).to.be('access'); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); @@ -382,33 +384,33 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('error'); @@ -417,22 +419,22 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Apache HTTP Server'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be('access'); menuEntries[0].click(); @@ -440,7 +442,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be('[Apache HTTP Server] access'); }); @@ -450,25 +452,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the uncategorized tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer .getUncategorizedTab() .then((tab) => tab.click()); }); it('should display a list of available datasets', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -481,19 +483,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the datasets list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); // Test ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -501,11 +503,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[2]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -513,11 +515,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); @@ -527,29 +529,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed dataset name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedUncategorized[1]); expect(await menuEntries[2].getVisibleText()).to.be(expectedUncategorized[2]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('retail'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('retail'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('retail'); @@ -558,17 +560,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should update the current selection with the clicked dataset', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect(await panelTitleNode.getVisibleText()).to.be('Uncategorized'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getUncategorizedContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedUncategorized[0]); menuEntries[0].click(); @@ -576,7 +578,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { const selectorButton = - await PageObjects.observabilityLogExplorer.getDatasetSelectorButton(); + await PageObjects.observabilityLogsExplorer.getDatasetSelectorButton(); expect(await selectorButton.getVisibleText()).to.be(expectedUncategorized[0]); }); @@ -585,28 +587,28 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open on the data views tab', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer.getDataViewsTab().then((tab) => tab.click()); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.getDataViewsTab().then((tab) => tab.click()); }); it('should display a list of available data views', async () => { await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); @@ -617,34 +619,34 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should sort the data views list by the clicked sorting option', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); // Test descending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('desc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('desc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[1]); expect(await menuEntries[1].getVisibleText()).to.be(sortedExpectedDataViews[0]); }); // Test back ascending order - await PageObjects.observabilityLogExplorer.clickSortButtonBy('asc'); + await PageObjects.observabilityLogsExplorer.clickSortButtonBy('asc'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(sortedExpectedDataViews[0]); expect(await menuEntries[1].getVisibleText()).to.be(sortedExpectedDataViews[1]); @@ -653,32 +655,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should filter the datasets list by the typed data view name', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[0].getVisibleText()).to.be(expectedDataViews[0]); expect(await menuEntries[1].getVisibleText()).to.be(expectedDataViews[1]); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('logs'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('logs'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('logs-*'); @@ -687,21 +689,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should navigate to Discover with the clicked data view preselected', async () => { await retry.try(async () => { - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); expect( - await PageObjects.observabilityLogExplorer.getDataViewsContextMenuTitle( + await PageObjects.observabilityLogsExplorer.getDataViewsContextMenuTitle( panelTitleNode ) ).to.be('Data Views'); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getDataViewsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(await menuEntries[1].getVisibleText()).to.be(expectedDataViews[1]); menuEntries[1].click(); @@ -717,27 +719,27 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when open/close the selector', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); beforeEach(async () => { await browser.refresh(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); }); it('should restore the latest navigation panel', async () => { await retry.try(async () => { - const { nodes } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { nodes } = await PageObjects.observabilityLogsExplorer.getIntegrations(); await nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -746,16 +748,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -766,18 +768,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should restore the latest search results', async () => { - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('system'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('system'); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); - await PageObjects.observabilityLogExplorer.closeDatasetSelector(); - await PageObjects.observabilityLogExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.closeDatasetSelector(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); await retry.try(async () => { - const { integrations } = await PageObjects.observabilityLogExplorer.getIntegrations(); + const { integrations } = await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.system]); }); }); @@ -785,29 +787,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('when switching between tabs or integration panels', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); }); it('should remember the latest search and restore its results', async () => { - await PageObjects.observabilityLogExplorer.openDatasetSelector(); - await PageObjects.observabilityLogExplorer.clearSearchField(); + await PageObjects.observabilityLogsExplorer.openDatasetSelector(); + await PageObjects.observabilityLogsExplorer.clearSearchField(); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('apache'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('apache'); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); nodes[0].click(); }); await retry.try(async () => { - const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogExplorer + const [panelTitleNode, menuEntries] = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() .then((menu) => Promise.all([ - PageObjects.observabilityLogExplorer.getPanelTitle(menu), - PageObjects.observabilityLogExplorer.getPanelEntries(menu), + PageObjects.observabilityLogsExplorer.getPanelTitle(menu), + PageObjects.observabilityLogsExplorer.getPanelEntries(menu), ]) ); @@ -816,40 +818,40 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await menuEntries[1].getVisibleText()).to.be('error'); }); - await PageObjects.observabilityLogExplorer.typeSearchFieldWith('err'); + await PageObjects.observabilityLogsExplorer.typeSearchFieldWith('err'); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); expect(menuEntries.length).to.be(1); expect(await menuEntries[0].getVisibleText()).to.be('error'); }); // Navigate back to integrations - const panelTitleNode = await PageObjects.observabilityLogExplorer + const panelTitleNode = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelTitle(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelTitle(menu)); panelTitleNode.click(); await retry.try(async () => { const { nodes, integrations } = - await PageObjects.observabilityLogExplorer.getIntegrations(); + await PageObjects.observabilityLogsExplorer.getIntegrations(); expect(integrations).to.eql([initialPackageMap.apache]); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('apache'); nodes[0].click(); }); await retry.try(async () => { - const menuEntries = await PageObjects.observabilityLogExplorer + const menuEntries = await PageObjects.observabilityLogsExplorer .getIntegrationsContextMenu() - .then((menu) => PageObjects.observabilityLogExplorer.getPanelEntries(menu)); + .then((menu) => PageObjects.observabilityLogsExplorer.getPanelEntries(menu)); - const searchValue = await PageObjects.observabilityLogExplorer.getSearchFieldValue(); + const searchValue = await PageObjects.observabilityLogsExplorer.getSearchFieldValue(); expect(searchValue).to.eql('err'); expect(menuEntries.length).to.be(1); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/filter_controls.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts similarity index 88% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/filter_controls.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts index 4cd5924e7608c..d0a4b79abbb51 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/filter_controls.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts @@ -9,7 +9,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['observabilityLogsExplorer', 'svlCommonPage']); describe('Filter controls customization', () => { before('initialize tests', async () => { @@ -23,7 +23,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('renders a filter controls section as part of the unified search bar', async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await testSubjects.existOrFail('datasetFiltersCustomization', { allowHidden: true }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts similarity index 77% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts index d33d9e97d18c6..f8087eff743c3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts @@ -34,22 +34,22 @@ const docs = [ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['observabilityLogsExplorer', 'svlCommonPage']); describe('Flyout content customization', () => { let cleanupDataStreamSetup: () => Promise; before('initialize tests', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -69,30 +69,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should mount the flyout customization content', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutDetail'); + await testSubjects.existOrFail('logsExplorerFlyoutDetail'); }); it('should display a timestamp badge', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogTimestamp'); + await testSubjects.existOrFail('logsExplorerFlyoutLogTimestamp'); }); it('should display a log level badge when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.existOrFail('logsExplorerFlyoutLogLevel'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogLevel'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogLevel'); }); it('should display a message code block when available', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.existOrFail('logsExplorerFlyoutLogMessage'); await dataGrid.closeFlyout(); await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.missingOrFail('logExplorerFlyoutLogMessage'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogMessage'); }); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout_highlights.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout_highlights.ts similarity index 62% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout_highlights.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout_highlights.ts index 85560ee85dd4b..9fa836815a554 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/flyout_highlights.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout_highlights.ts @@ -35,7 +35,7 @@ const sharedDoc = { export default function ({ getService, getPageObjects }: FtrProviderContext) { const dataGrid = getService('dataGrid'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['observabilityLogExplorer', 'svlCommonPage']); + const PageObjects = getPageObjects(['observabilityLogsExplorer', 'svlCommonPage']); describe('Flyout highlight customization', () => { let cleanupDataStreamSetup: () => Promise; @@ -61,11 +61,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutServiceName, docWithoutServiceInfraContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); @@ -77,7 +77,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -90,29 +90,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the service container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.existOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.existOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should load the service container even when 1 field is missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); - await testSubjects.missingOrFail('logExplorerFlyoutService'); - await testSubjects.existOrFail('logExplorerFlyoutTrace'); - await testSubjects.existOrFail('logExplorerFlyoutHostName'); - await testSubjects.existOrFail('logExplorerFlyoutClusterName'); - await testSubjects.existOrFail('logExplorerFlyoutResourceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutService'); + await testSubjects.existOrFail('logsExplorerFlyoutTrace'); + await testSubjects.existOrFail('logsExplorerFlyoutHostName'); + await testSubjects.existOrFail('logsExplorerFlyoutClusterName'); + await testSubjects.existOrFail('logsExplorerFlyoutResourceId'); await dataGrid.closeFlyout(); }); it('should not load the service container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionServiceInfra'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionServiceInfra'); await dataGrid.closeFlyout(); }); }); @@ -131,11 +131,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutCloudProviderAndInstanceId, docWithoutCloudContainer]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); @@ -147,7 +147,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -160,36 +160,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the cloud container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); it('should load the cloud container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionCloud'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); - await testSubjects.existOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.existOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.existOrFail('logExplorerFlyoutCloudProjectId'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.existOrFail('logsExplorerFlyoutCloudProjectId'); await dataGrid.closeFlyout(); }); it('should not load the cloud container if all fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 2 }); - await testSubjects.missingOrFail('logExplorerFlyoutHighlightSectionCloud'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProvider'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudRegion'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudAz'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudProjectId'); - await testSubjects.missingOrFail('logExplorerFlyoutCloudInstanceId'); + await testSubjects.missingOrFail('logsExplorerFlyoutHighlightSectionCloud'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProvider'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudRegion'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudAz'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudProjectId'); + await testSubjects.missingOrFail('logsExplorerFlyoutCloudInstanceId'); await dataGrid.closeFlyout(); }); }); @@ -203,11 +203,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const docs = [sharedDoc, docWithoutLogPathAndAgentName]; before('setup DataStream', async () => { - cleanupDataStreamSetup = await PageObjects.observabilityLogExplorer.setupDataStream( + cleanupDataStreamSetup = await PageObjects.observabilityLogsExplorer.setupDataStream( DATASET_NAME, NAMESPACE ); - await PageObjects.observabilityLogExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); + await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); await PageObjects.svlCommonPage.login(); }); @@ -219,7 +219,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); beforeEach(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { time: { from: new Date(NOW - 60_000).toISOString(), @@ -232,23 +232,23 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should load the other container with all fields', async () => { await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); - await testSubjects.existOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); - await testSubjects.existOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutLogShipper'); await dataGrid.closeFlyout(); }); it('should load the other container even when some fields are missing', async () => { await dataGrid.clickRowToggle({ rowIndex: 1 }); - await testSubjects.existOrFail('logExplorerFlyoutHighlightSectionOther'); + await testSubjects.existOrFail('logsExplorerFlyoutHighlightSectionOther'); - await testSubjects.missingOrFail('logExplorerFlyoutLogPathFile'); - await testSubjects.missingOrFail('logExplorerFlyoutLogShipper'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogPathFile'); + await testSubjects.missingOrFail('logsExplorerFlyoutLogShipper'); - await testSubjects.existOrFail('logExplorerFlyoutNamespace'); - await testSubjects.existOrFail('logExplorerFlyoutDataset'); + await testSubjects.existOrFail('logsExplorerFlyoutNamespace'); + await testSubjects.existOrFail('logsExplorerFlyoutDataset'); await dataGrid.closeFlyout(); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts similarity index 82% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts index 386177dde6f67..a4768c4415e4b 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts @@ -15,7 +15,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects([ 'discover', - 'observabilityLogExplorer', + 'observabilityLogsExplorer', 'svlCommonPage', 'timePicker', 'header', @@ -27,11 +27,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.load( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); await PageObjects.svlCommonPage.login(); - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); }); @@ -39,19 +39,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.svlCommonPage.forceLogout(); await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); await esArchiver.unload( - 'x-pack/test/functional/es_archives/observability_log_explorer/data_streams' + 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); }); it('should inject the app header menu on the top navbar', async () => { - const headerMenu = await PageObjects.observabilityLogExplorer.getHeaderMenu(); + const headerMenu = await PageObjects.observabilityLogsExplorer.getHeaderMenu(); expect(await headerMenu.isDisplayed()).to.be(true); }); describe('Discover fallback link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { // avoid aligning with the test data, because that's what Discover // does later in this test and we wouldn't be able to check the time @@ -67,7 +67,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should render a button link ', async () => { - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); expect(await discoverLink.isDisplayed()).to.be(true); }); @@ -78,9 +78,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); const timeConfig = await PageObjects.timePicker.getTimeConfig(); // Set query bar value - await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + await PageObjects.observabilityLogsExplorer.submitQuery('*favicon*'); - const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink(); + const discoverLink = await PageObjects.observabilityLogsExplorer.getDiscoverFallbackLink(); discoverLink.click(); await PageObjects.discover.waitForDocTableLoadingComplete(); @@ -99,14 +99,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await PageObjects.timePicker.getTimeConfig()).to.eql(timeConfig); }); await retry.try(async () => { - expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).to.eql('*favicon*'); + expect(await PageObjects.observabilityLogsExplorer.getQueryBarValue()).to.eql( + '*favicon*' + ); }); }); }); describe('Discover tabs', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo({ + await PageObjects.observabilityLogsExplorer.navigateTo({ pageState: { // avoid aligning with the test data, because that's what Discover // does later in this test and we wouldn't be able to check the time @@ -130,7 +132,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const timeConfig = await PageObjects.timePicker.getTimeConfig(); // Set query bar value - await PageObjects.observabilityLogExplorer.submitQuery('*favicon*'); + await PageObjects.observabilityLogsExplorer.submitQuery('*favicon*'); // go to discover tab await testSubjects.click('discoverTab'); @@ -138,7 +140,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { deepLinkId: 'discover', }); await PageObjects.svlCommonNavigation.breadcrumbs.expectBreadcrumbMissing({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); expect(await browser.getCurrentUrl()).contain('/app/discover'); @@ -159,36 +161,36 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await retry.try(async () => { - expect(await PageObjects.observabilityLogExplorer.getQueryBarValue()).not.to.eql( + expect(await PageObjects.observabilityLogsExplorer.getQueryBarValue()).not.to.eql( '*favicon*' ); }); - // go to log explorer tab - await testSubjects.click('logExplorerTab'); + // go to logs explorer tab + await testSubjects.click('logsExplorerTab'); await PageObjects.svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'discover', }); await PageObjects.svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ - deepLinkId: 'observability-log-explorer', + deepLinkId: 'observability-logs-explorer', }); - expect(await browser.getCurrentUrl()).contain('/app/observability-log-explorer'); + expect(await browser.getCurrentUrl()).contain('/app/observability-logs-explorer'); }); }); describe('Add data link', () => { before(async () => { - await PageObjects.observabilityLogExplorer.navigateTo(); + await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); }); it('should render a button link ', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); expect(await onboardingLink.isDisplayed()).to.be(true); }); it('should navigate to the observability onboarding overview page', async () => { - const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink(); + const onboardingLink = await PageObjects.observabilityLogsExplorer.getOnboardingLink(); onboardingLink.click(); await retry.try(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts similarity index 93% rename from x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts rename to x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts index ad6f7b7278e48..c248e31df92e3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('Observability Log Explorer', function () { + describe('Observability Logs Explorer', function () { loadTestFile(require.resolve('./app')); loadTestFile(require.resolve('./columns_selection')); loadTestFile(require.resolve('./dataset_selection_state')); diff --git a/x-pack/test_serverless/functional/test_suites/search/navigation.ts b/x-pack/test_serverless/functional/test_suites/search/navigation.ts index 8796dcfe93773..bfa31544f7d0b 100644 --- a/x-pack/test_serverless/functional/test_suites/search/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/search/navigation.ts @@ -64,7 +64,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.sidenav.expectLinkActive({ deepLinkId: 'serverlessElasticsearch', }); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: `Get started` }); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: `Home` }); await testSubjects.existOrFail(`svlSearchOverviewPage`); await expectNoPageReload(); diff --git a/yarn.lock b/yarn.lock index fa40b7667330a..e0dd741228a76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1739,10 +1739,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@92.1.1": - version "92.1.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-92.1.1.tgz#f5713bfa12733a2c62df365e37f7983a7c08411e" - integrity sha512-kjUP+IewVcoJ59e84lHwtdy5OvGNSmlHvzn5uUmGTKnBGOxoYv5K9pyGujVWpxSCG9MNr3anMsNE7EX6usj37A== +"@elastic/eui@92.2.1": + version "92.2.1" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-92.2.1.tgz#172b5122e1025307bbb8e2c6a115c3feb3a16f42" + integrity sha512-FujsbJtuh8mxG5mbqclQBdPoW1kn9kXd/hpaMXUJa7bb0bmqlJRmagULPTZ+5e60Q6PEQt+e7MFDsaq4elSthQ== dependencies: "@hello-pangea/dnd" "^16.3.0" "@types/lodash" "^4.14.198" @@ -27543,10 +27543,10 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@^4.16.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.16.0.tgz#2f1a2426d876aa389d1c937b00f034c2c7808360" - integrity sha512-IbqpRpfGE7JDGgXHJeWuCqT/tUqnLvZ14csSwt+S8o4nJo3RtQoE9VR4jB47tP/A8ArkYsh/THuMY6kyRP6kuA== +selenium-webdriver@^4.17.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.17.0.tgz#f6c93a9df3e0543df7dc2329d81968af42845a7f" + integrity sha512-e2E+2XBlGepzwgFbyQfSwo9Cbj6G5fFfs9MzAS00nC99EewmcS2rwn2MwtgfP7I5p1e7DYv4HQJXtWedsu6DvA== dependencies: jszip "^3.10.1" tmp "^0.2.1"